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技术站