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_path
和 static_url_path
都是静态内容( javascript 、 CSS 等)的 URL 路径前缀,static_path
可能有歧义,已被弃用,改用 static_url_path
。
static_folder
为静态内容的目录,默认为 static
目录。它也影响静态内容的 URL 前缀,当没有设置 static_url_path
时,会使用 /<static_folder>
作为 URL 前缀。
template_folder
为模板目录,默认为 templates
。render_template
函数从目录中找模板文件,然后用 Jinja2 进行渲染。
instance_path
为应用实例的所在目录,用绝对路径表示。一般不需要指定,Flask 通过 import_name
可找到所在的模块,然后在后面加上 instance
。 instance
目录通常用来保存配置文件,当 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 装饰视图函数、回调函数,从而把需要实现的功能注册到相应的函数表。