Flask核心机制之上下文源码剖析

Flask核心机制之上下文源码剖析

在Flask中,上下文是一个非常重要的概念。它允许我们在应用程序中共享数据,而不必将数据传递给每个函数或方法。本文将深入探讨Flask上下文的实现方式,并提供示例代码。

Flask上下文

在Flask中,有两种上下文:应用上下文和请求上下文。应用上下文是全局的,与应用程序相关,而请求上下文是与每个请求相关的。在应用程序处理请求时,Flask会自动创建和销毁这些上下文。

应用上下文包含应用程序的配置和其他全局数据。请求上下文包含与请求相关的数据,例如请求的URL、请求的参数和请求的表单数据。

上下文栈

Flask使用上下文栈来管理上下文。上下文栈是一个后进先出(LIFO)的数据结构,用于存储应用程序和请求上下文。当应用程序处理请求时,Flask会将请求上下文推入上下文栈的顶部。当请求处理完成时,Flask会将请求上下文从上下文栈中弹出。

以下是一个示例代码,演示如何使用Flask上下文:

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
    name = request.args.get('name')
    return f'Hello, {name}!'

if __name__ == '__main__':
    app.run()

在上面的代码中,我们定义了一个名为app的Flask应用程序。我们还定义了一个名为index的视图函数,它从请求上下文中获取名为name的参数,并将其用于生成响应。最后,我们使用app.run()方法运行应用程序。

应用上下文

应用上下文是全局的,与应用程序相关。它包含应用程序的配置和其他全局数据。在Flask中,应用上下文由Flask类实例化时创建。

以下是Flask类的部分源代码,演示如何创建应用上下文:

```python
class Flask(_PackageBoundObject):
def init(self, import_name: str, static_url_path: Optional[str] = None, static_folder: Optional[str] = 'static', static_host: Optional[str] = None, host_matching: bool = False, subdomain_matching: bool = False, template_folder: Optional[str] = 'templates', instance_path: Optional[str] = None, instance_relative_config: bool = False, root_path: Optional[str] = None):
self.import_name = import_name
self.static_url_path = static_url_path
self.static_folder = static_folder
self.static_host = static_host
self.host_matching = host_matching
self.subdomain_matching = subdomain_matching
self.template_folder = template_folder
self.instance_path = instance_path
self.instance_relative_config = instance_relative_config
self.root_path = root_path or self._get_root_path()

    self.view_functions = {}
    self.error_handler_spec = {}
    self.url_map = Map()
    self.before_request_funcs = []
    self.after_request_funcs = []
    self.teardown_request_funcs = []
    self.url_value_preprocessors = {}
    self.url_default_functions = {}
    self.shell_context_processors = []
    self.template_context_processors = {}
    self.request_class = Request
    self.json_encoder = JSONEncoder
    self.json_decoder = JSONDecoder
    self.response_class = Response
    self.session_interface = SecureCookieSessionInterface()
    self.debug = None
    self.testing = False
    self.secret_key = None
    self.permanent_session_lifetime = timedelta(days=31)
    self.use_x_sendfile = False
    self.logger = logging.getLogger(self.import_name)
    self.logger.addHandler(default_handler)
    self.logger.setLevel(logging.INFO)
    self.before_first_request_funcs = []
    self.after_this_request_funcs = []
    self.template_folder = self.get_template_folder()
    self.jinja_env = self.create_jinja_environment()
    self.jinja_options = self.jinja_env.options.copy()
    self.jinja_options.update(
        dict(
            autoescape=select_autoescape(['html', 'htm', 'xml'], default_for_string=True),
            enable_async=True,
        )
    )
    self.jinja_env.options = self.jinja_options
    self.jinja_env.globals.update(
        url_for=url_for,
        get_flashed_messages=get_flashed_messages,
        config=self.config,
    )
    self.jinja_env.filters.update(
        json=json_filter,
        tojson=json.dumps,
        escape=escape,
        urlquote=url_quote,
        urlquote_plus=url_quote_plus,
        do_filesizeformat=filesizeformat,
        do_datetimeformat=datetimeformat,
        do_timeformat=timeformat,
        do_dateformat=dateformat,
        do_timedeltaformat=timedeltaformat,
        do_intcomma=intcomma,
        do_safemarkdown=safemarkdown,
        do_markdown=markdown,
        do_strikethrough=strikethrough,
        do_urlize=urlize,
        do_auto_link_for_email=auto_link_for_email,
        do_auto_link_for_url=auto_link_for_url,
        do_auto_link=auto_link,
        do_plaintext=plaintext,
        do_wordwrap=wordwrap,
        do_replace=replace,
        do_round=round_filter,
        do_float=float_filter,
        do_int=int_filter,
        do_slice=slice_filter,
        do_sum=sum_filter,
        do_sort=sorted,
        do_groupby=groupby,
        do_attrgetter=attrgetter,
        do_itemgetter=itemgetter,
        do_batch=batch,
        do_cycle=cycle,
        do_zip=zip,
        do_map=map,
        do_select=select,
        do_reject=reject,
        do_reduce=reduce,
        do_concat=concat,
        do_unique=unique,
        do_flatten=flatten,
        do_indent=indent,
        do_truncate=truncate,
        do_wordcount=wordcount,
        do_capitalize=capitalize,
        do_title=title,
        do_lower=lower,
        do_upper=upper,
        do_trim=trim,
        do_striptags=striptags,
        do_dictsort=dictsort,
        do_dictsortreversed=dictsortreversed,
        do_first=first,
        do_last=last,
        do_random=random,
        do_pprint=pprint,
        do_gettext=gettext,
        do_ngettext=ngettext,
        do_pgettext=pgettext,
        do_npgettext=npgettext,
        do_format=format,
        do_format_map=format_map,
        do_format_html=format_html,
        do_format_html_join=format_html_join,
        do_format_date=format_date,
        do_format_time=format_time,
        do_format_datetime=format_datetime,
        do_format_timedelta=format_timedelta,
        do_format_currency=format_currency,
        do_format_number=format_number,
        do_format_percent=format_percent,
        do_format_scientific=format_scientific,
        do_format_decimal=format_decimal,
        do_url_decode=url_decode,
        do_url_encode=url_encode,
        do_url_fix=url_fix,
        do_url_unquote=url_unquote,
        do_url_unquote_plus=url_unquote_plus,
        do_url_quote_plus=url_quote_plus,
        do_url_quote=url_quote,
        do_url_for=url_for,
        do_static=static_file_url,
        do_filesizeformat=filesizeformat,
        do_datetimeformat=datetimeformat,
        do_timeformat=timeformat,
        do_dateformat=dateformat,
        do_timedeltaformat=timedeltaformat,
        do_intcomma=intcomma,
        do_safemarkdown=safemarkdown,
        do_markdown=markdown,
        do_strikethrough=strikethrough,
        do_urlize=urlize,
        do_auto_link_for_email=auto_link_for_email,
        do_auto_link_for_url=auto_link_for_url,
        do_auto_link=auto_link,
        do_plaintext=plaintext,
        do_wordwrap=wordwrap,
        do_replace=replace,
        do_round=round_filter,
        do_float=float_filter,
        do_int=int_filter,
        do_slice=slice_filter,
        do_sum=sum_filter,
        do_sort=sorted,
        do_groupby=groupby,
        do_attrgetter=attrgetter,
        do_itemgetter=itemgetter,
        do_batch=batch,
        do_cycle=cycle,
        do_zip=zip,
        do_map=map,
        do_select=select,
        do_reject=reject,
        do_reduce=reduce,
        do_concat=concat,
        do_unique=unique,
        do_flatten=flatten,
        do_indent=indent,
        do_truncate=truncate,
        do_wordcount=wordcount,
        do_capitalize=capitalize,
        do_title=title,
        do_lower=lower,
        do_upper=upper,
        do_trim=trim,
        do_striptags=striptags,
        do_dictsort=dictsort,
        do_dictsortreversed=dictsortreversed,
        do_first=first,
        do_last=last,
        do_random=random,
        do_pprint=pprint,
        do_gettext=gettext,
        do_ngettext=ngettext,
        do_pgettext=pgettext,
        do_npgettext=npgettext,
        do_format=format,
        do_format_map=format_map,
        do_format_html=format_html,
        do_format_html_join=format_html_join,
        do_format_date=format_date,
        do_format_time=format_time,
        do_format_datetime=format_datetime,
        do_format_timedelta=format_timedelta,
        do_format_currency=format_currency,
        do_format_number=format_number,
        do_format_percent=format_percent,
        do_format_scientific=format_scientific,
        do_format_decimal=format_decimal,
        do_url_decode=url_decode,
        do_url_encode=url_encode,
        do_url_fix=url_fix,
        do_url_unquote=url_unquote,
        do_url_unquote_plus=url_unquote_plus,
        do_url_quote_plus=url_quote_plus,
        do_url_quote=url_quote,
        do_url_for=url_for,
        do_static=static_file_url,
    )
    self.jinja_env.install_gettext_callables(gettext, ngettext, newstyle=True)
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension('jinja2.ext.i18n')
    self.jinja_env.add_extension('jinja2.ext.autoescape')
    self.jinja_env.add_extension('jinja2.ext.debug')
    self.jinja_env.add_extension('jinja2.ext.extlinks')
    self.jinja_env.add_extension('jinja2.ext.internationalization')
    self.jinja_env.add_extension('jinja2.ext.do')
    self.jinja_env.add_extension('jinja2.ext.loopcontrols')
    self.jinja_env.add_extension('jinja2.ext.with_')
    self.jinja_env.add_extension

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flask核心机制之上下文源码剖析 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • Python列表list排列组合操作示例

    Python列表list排列组合操作示例 在Python中,列表(list)是一种常用的数据类型,可以存储多个元素。本文将深入讲解Python列表list排列组合操作示例,并提供两个示例说明。 排列操作 排列是指从n个不同素中取出m个元素进行排列,排列的结果是有序的。在Python中,可以使用itertools库中的permutations()函数来现排列操…

    python 2023年5月13日
    00
  • python 如何读、写、解析CSV文件

    在Python中,可以使用内置的csv模块来读取、写入和解析CSV文件。以下是读取、写入和解析CSV文件的详细攻略: 读取CSV文件 要读取CSV文件,可以使用csv模块的reader()函数。以下是读取CSV文件的示例: import csv with open(‘data.csv’, newline=”) as f: reader = csv.read…

    python 2023年5月14日
    00
  • Python中死锁的形成示例及死锁情况的防止

    Python中死锁的形成示例及死锁情况的防止 什么是死锁? 死锁指的是多个进程(或线程)因相互等待对方持有的资源而陷入僵局,无法继续向前执行。在 Python 中,由于 GIL(全局解释器锁)的存在,多线程下使用锁可能会产生死锁问题。 死锁的形成 举一个简单的例子,假设有两个线程 A 和 B,共享着两把锁 lockA 和 lockB。如果线程 A 先锁定了 …

    python 2023年5月13日
    00
  • 详解Python requests 超时和重试的方法

    以下是关于Python requests 超时和重试的方法的完整攻略: 问题描述 在使用 Python requests 库发送 HTTP 请求时,可能会遇到超时和重试的问题。本略将介绍如何使用 Python requests 库设置超时和重试以确保请求成功稳定性。 解决方法 使用以下步骤 Python requests 超时和重试: 设置超时时间。 可以使…

    python 2023年5月13日
    00
  • Python实现获取本地及远程图片大小的方法示例

    作为网站作者,我们可以提供以下Python实现获取本地及远程图片大小的方法示例: 获取本地图片大小 在Python中,我们可以使用PIL库来操作图片。要获取本地图片大小,可以使用Image.open()方法打开图片,然后使用获取大小属性size: from PIL import Image file_path = "path/to/image.jp…

    python 2023年6月3日
    00
  • Python中的简写操作(for、if简写、匿名函数)

    Python中的简写操作是Python中一个非常实用的特性,可以让我们用更少的代码来完成一些常见的操作。其中包括for循环简写、if简写和匿名函数。 for循环简写 在Python中,我们经常需要遍历一个列表或者字典,通常我们使用for循环来完成这个任务。但是,有时候我们只需要对列表或字典中的一部分元素进行操作,这个时候就可以使用for循环的简写: 语法 […

    python 2023年5月31日
    00
  • python dict如何定义

    让我来详细讲解Python字典的定义。 Python字典 Python中的dict是一种可变容器模型,它用于存储键值对。字典被称为映射类型,因为它们使用键来映射值。 字典是无序的,即不支持索引和切片等操作,它的元素是由键值对组成的,每个键值对之间用英文冒号(:)分隔,整个字典用大括号({})括起来。例如: my_dict = {‘name’: ‘Tom’, …

    python 2023年5月13日
    00
  • 可能是最全面的 Python 字符串拼接总结【收藏】

    “可能是最全面的 Python 字符串拼接总结【收藏】”是一篇对 Python 字符串拼接的总结性文章。如果你想学习和提高 Python 字符串的拼接技能,可以参考这篇文章。下面是该文章的详细讲解: 标题 文章的标题对于读者来说非常重要,它可以让读者快速了解文章的主题和内容。该文章的标题为“可能是最全面的 Python 字符串拼接总结【收藏】”,通过这个标题…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部