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 字典套字典或列表的示例

    下面是关于Python字典套字典或列表的攻略。 什么是字典套字典/列表 在Python中,字典套字典或列表是指字典中的值为字典或列表。这种方式可以方便的描述和存储复杂的数据结构。例如,普通的字典可能无法保存一个包含多个相同数据类型的结构,而字典套字典或列表就可以有效的存储。 字典套字典示例1 下面是一个基本的字典嵌套字典的例子,用于存储学生信息: stude…

    python 2023年5月13日
    00
  • python从网络读取图片并直接进行处理的方法

    要实现“Python从网络读取图片并直接进行处理”的功能,一般需要借助Python的第三方库requests和Pillow(或者OpenCV)。下面我将详细讲解实现方法。 1. 安装第三方库 使用 pip 命令安装 requests 和 Pillow 两个库,具体命令如下: pip install requests Pillow 2. 从网络读取图片 使用r…

    python 2023年5月18日
    00
  • 致Python初学者 Anaconda入门使用指南完整版

    致Python初学者:Anaconda入门使用指南完整版 本文旨在介绍Anaconda的基本概念、下载安装方法和使用方法,以及常用的conda命令和Jupyter Notebook的使用方法。 什么是Anaconda Anaconda是一个用于数据科学的开源发行版,支持多种操作系统(Windows、Linux和macOS),它提供了包管理和环境管理的功能,可…

    python 2023年5月18日
    00
  • Python中命令行参数argparse模块的使用

    一、介绍 Python中有一个很强大的命令行参数解析模块 argparse ,使用 argparse 可以非常方便地解析命令行参数并生成帮助信息。argparse 模块可以自动生成帮助信息,还可以自动检查参数和选项的类型以及输入的值是否合法。 二、基本使用 在使用 argparse 之前,需要先导入 argparse 库: import argparse 接…

    python 2023年6月3日
    00
  • 用python绘制极坐标雷达图

    下面是用Python绘制极坐标雷达图的攻略: 1. 参考库 Python绘制极坐标雷达图需要使用到matplotlib库,需要在代码开头导入该库: import matplotlib.pyplot as plt 2. 绘制极坐标图 首先,我们需要新建一个matplotlib绘图环境: fig = plt.figure(figsize=(6,6)) ax = …

    python 2023年5月19日
    00
  • Python序列对象与String类型内置方法详解

    Python序列对象与String类型内置方法详解 什么是序列对象 序列是Python中最基本的数据结构之一。通俗点说,序列就是一连串按照固定顺序排列的元素集合,这些元素可以是数字、字母、字符串、子列表等数据类型。Python中内置了一些序列类型,比如字符串(str)、列表(list)、元组(tuple)等。 序列对象通常具有共同的特点,比如: 可以通过索引…

    python 2023年5月14日
    00
  • 预签名 URL:发布图像错误:签名不匹配:Python

    【问题标题】:presigned URL : Post image error: Signature does not match: Python预签名 URL:发布图像错误:签名不匹配:Python 【发布时间】:2023-04-01 02:58:02 【问题描述】: 我将在 lambda 中执行以下命令以生成预签名 URL ”’ import boto…

    Python开发 2023年4月8日
    00
  • Python即时网络爬虫项目启动说明详解

    Python即时网络爬虫项目启动说明详解 本文介绍如何启动一个基于Python的即时网络爬虫项目,首先,我们需要了解一些基础知识和工具。 基础工具 Python开发环境 网页分析工具:如Chrome开发者工具、Firebug等 第三方Python包:如requests、beautifulsoup4、pandas等 网络爬虫技术基础 网络协议:如HTTP、HT…

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