Inside Flask - app.py - 2

Flask 初始化参数

Flass 类是 Flask 框架的核心,一个 flask 对象处理视图函数注册、URL规则、模板配置、参数设置等等。

一般地, Flask 在使用时,先创建一个 flask 对象:

from flask import Flask

app = Flask(__name__)

除此之后, Flask 的初始化支持更多的参数,其完整的函数签名为:

def __init__(self, import_name, static_path=None, static_url_path=None,
static_folder='static', template_folder='templates',
instance_path=None, instance_relative_config=False)

这些参数里面,可能最需要说明的是 import_name。一般地,在单模块方式(即只使用一个文件包含全部代码)下使用 Flask , import_name 参数会使用 __name__ 。而 Flask 建议,以 package 的方式使用 Flask (即 yourapplication/app.py 形式,yourapplication 包内包含其它 Flask 相关代码),就应该采用硬编码的 'yourapplication' ,或者是 __name__.split('.')[0] 的方式。由于一些扩展,需要使用 import_name 来判断 Flask 应用的范围(在整个 yourapplication 包内,而 __name__ 只包括了 yourapplication.app 模块),从而为整个 Flask 应用提供更好的调试信息。

static_pathstatic_url_path 都是静态内容( javascript 、 CSS 等)的 URL 路径前缀,static_path 可能有歧义,已被弃用,改用 static_url_path

static_folder 为静态内容的目录,默认为 static 目录。它也影响静态内容的 URL 前缀,当没有设置 static_url_path 时,会使用 /<static_folder> 作为 URL 前缀。

template_folder 为模板目录,默认为 templatesrender_template 函数从目录中找模板文件,然后用 Jinja2 进行渲染。

instance_path 为应用实例的所在目录,用绝对路径表示。一般不需要指定,Flask 通过 import_name 可找到所在的模块,然后在后面加上 instanceinstance 目录通常用来保存配置文件,当 instance_relative_config 为 True 时,app.config.from_pyfile 会尝试从这个目录加载配置文件(行 344 、 600 )。

Flask 初始化过程

Flask 的初始化过程,设置整个 Flask 应用的基本环境,函数表等等(Flask 继承了 flask.helper._PackageBoundObject,它主要是包含了几个简单属性初始化)。

首先,记录 static_path static_url_path instance_path 这几个属性。

344 行初始化 config。 它使用 self.make_config 创建一个 config.Config 对象,当参数中设置 instance_relative_config=True 时,config 中使用 instance 路径为默认的配置文件路径,可从这个路径中加载配置文件。

347 - 348 行设置日志的默认参数。

354 行开始初始化函数表,并把各个函数表都设置为空,这些函数表包括:

self.view_functions         # 视图函数,通过 route 装饰器注册
self._error_handlers # 应使用 error_handler_spec
self.error_handler_spec # 错误处理,通过 errorhandler 装饰器注册
self.url_build_error_handlers # 路径构建错误(如 url_for )时回调函数
self.before_request_funcs # 请求开始前回调函数,通过 before_request 装饰器注册
self.before_first_request_funcs # 第一个请求前回调函数,用 befort_first_request 装饰器注册
self.after_request_funcs # 请求完成后回调函数,用 after_request 装饰器注册
self.teardown_request_funcs # 请求完成后的调用,用 teardown_request 装饰器注册
self.teardown_appcontext_funcs # 清理上下文
self.url_value_preprocessors # URL 特殊处理,在行 1656 进行
self.url_default_functions # URL 处理,在行 1618 进行
self.template_context_processors # 模板上下文处理,用 context_processor 装饰器注册
self.blueprints # blueprint
self.extensions # 扩展
self.url_map
self._got_first_request # 标记是否已进行过请求
self._before_request_lock # 锁

最后,把 static 加到 URL 规则中:

if self.has_static_folder:
self.add_url_rule(self.static_url_path + '/<path:filename>',
endpoint='static',
view_func=self.send_static_file)

初始化完成后,大部分的函数表设置为空白的字典或列表,后续的加载中,可通过相应的 decorator 装饰视图函数、回调函数,从而把需要实现的功能注册到相应的函数表。

05-04 11:25