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

yizhihongxing

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文件读取和导包的绝对路径和相对路径,它们之间有何区别? Python读取文件时采用的是哪些常见的方法? Python中相对路径和绝对路径的区别、优缺点以及使用时需要注意些什么? 1. 什么是Python文件读取和导包的绝对路径…

    python 2023年6月5日
    00
  • python+mysql实现学生信息查询系统

    下面就来详细讲解一下“python+mysql实现学生信息查询系统”的完整攻略: 1. 准备工作 在实现学生信息查询系统之前,需要准备以下工具和环境: Python 3.x Mysql 5.x pymysql 模块 其中,Python 3.x 应该已经安装在了电脑上,如果没有安装可以前往官网下载安装。接下来就是安装 Mysql 5.x 和 pymysql 模…

    python 2023年5月30日
    00
  • 关于python中readlines函数的参数hint的相关知识总结

    当我们在使用Python中的readlines()函数读取文件时,可以通过添加hint参数来指定每次读取的字节数。本文将详细介绍readlines()函数的hint参数,并带有示例代码进行演示。 什么是hint参数? 当我们在使用readlines()函数来读取一个文件时,每次读取的字节数不是确定的。因此,Python解释器就需要不停地读取硬盘上的数据,判断…

    python 2023年6月5日
    00
  • python实现将json多行数据传入到mysql中使用

    将JSON数据插入到MySQL数据库中,主要有以下4个步骤: 解析JSON数据,提取需要的信息; 连接MySQL数据库; 创建数据库表; 将数据插入到数据库表中。 下面我来详细讲解一下每一个步骤,并提供两个示例: 1. 解析JSON数据 我们可以使用python自带的json库来解析JSON数据,可参考下面的代码: import json # 定义JSON数…

    python 2023年6月3日
    00
  • 使用Python多线程爬虫爬取电影天堂资源

    使用Python多线程爬虫可以提高爬取资源的速度,特别是在需要爬取大量数据的情况下。以下是使用Python多线程爬虫爬取电影天堂资源的完整攻略。 确认目标网站 首先,我们需要确认需要爬取的目标网站。针对本例中的电影天堂资源,我们需要先确定目标页面的URL。 电影天堂搜索页面的URL格式为:http://www.dytt8.net/html/gndy/dyzz…

    python 2023年5月14日
    00
  • python:接口间数据传递与调用方法

    Python 是一种通用编程语言,可以用于开发不同类型的应用程序和系统,通过编写接口实现不同组件之间的互通。本文将介绍Python中接口间数据传递与调用方法的完整攻略。 接口间数据传递方法 接口间数据传递是指将数据从一个接口传输到另一个接口。以下是实现接口间数据传递的常用方法。 方式一:使用函数传递数据 函数是 Python 中最基本的模块之一,因为它们可以…

    python 2023年6月3日
    00
  • Python使用遗传算法解决最大流问题

    Python使用遗传算法解决最大流问题 本文将详细介绍如何使用Python和遗传算法解决最大流问题。我们将介绍最大流问题的基本原理和遗传算法的基本原理,以及如何使用Python实现遗传算法解决最大流问题。同时,我们提供两个示例说明,分别使用遗传算法解决最大流问题和最小割问题。 最大流问题简介 最大流问题是指在一个有向图中,从源点到汇点的最大流量。最大流问题是…

    python 2023年5月14日
    00
  • Python matplotlib包和gif包生成gif动画实战对比

    下面是关于“Python matplotlib包和gif包生成gif动画实战对比”的攻略: 前言 生成动图对于数据可视化来说是非常重要的。Python中提供了多种生成动图的方式,其中matplotlib与gif包都是非常常见的库。matplotlib提供了非常强大的绘图功能,而gif包则专注于生成gif动图。本文将对两者进行详细的对比分析,并提供两个示例用于…

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