一行 app = Flask(__name__) 背后,应用对象到底拥有什么?哪些是此刻就创建好的,哪些要等用到才创建?这篇逐项打印出来看。
appmod.py 里的代码:
1 | from flask import Flask
2 | app = Flask(__name__)
3 | print(app.name, app.import_name)
4 | print('root_path ', app.root_path)
5 | print('instance_path ', app.instance_path)
6 | print('static_folder ', app.static_folder, '| static_url_path', app.static_url_path)
7 | print('template_folder', app.template_folder)
8 | print('url_map 规则 ', [str(r) for r in app.url_map.iter_rules()])
9 | print('view_functions', list(app.view_functions))
10 | print('config 键数 ', len(app.config))
11 | print('blueprints ', app.blueprints, '| extensions', app.extensions)
12 | print('session 接口 ', type(app.session_interface).__name__, '| json provider', type(app.json).__name__)
13 | print('jinja_env 是否已创建', 'jinja_env' in app.__dict__)
appmod appmod
root_path <实验目录>/fltmp/f1a
instance_path <实验目录>/fltmp/f1a/instance
static_folder <实验目录>/fltmp/f1a/static | static_url_path /static
template_folder templates
url_map 规则 ['/static/<path:filename>']
view_functions ['static']
config 键数 29
blueprints {} | extensions {}
session 接口 SecureCookieSessionInterface | json provider DefaultJSONProvider
jinja_env 是否已创建 False下一篇看 app.run() 做了什么:app.run() 的启动过程。
全部键: 29
DEBUG False
TESTING False
SECRET_KEY None
SERVER_NAME None
APPLICATION_ROOT '/'
PREFERRED_URL_SCHEME 'http'
MAX_CONTENT_LENGTH None
SESSION_COOKIE_NAME 'session'
SESSION_COOKIE_HTTPONLY True
SESSION_COOKIE_SECURE False
SESSION_COOKIE_SAMESITE None
PERMANENT_SESSION_LIFETIME datetime.timedelta(days=31)
TRAP_HTTP_EXCEPTIONS False
PROPAGATE_EXCEPTIONS None
JSON_SORT_KEYS '(没有这个键)'
TEMPLATES_AUTO_RELOAD None
全部键名: ['APPLICATION_ROOT', 'DEBUG', 'EXPLAIN_TEMPLATE_LOADING', 'MAX_CONTENT_LENGTH', 'MAX_COOKIE_SIZE', 'MAX_FORM_MEMORY_SIZE', 'MAX_FORM_PARTS', 'PERMANENT_SESSION_LIFETIME', 'PREFERRED_URL_SCHEME', 'PROPAGATE_EXCEPTIONS', 'PROV 规则 /static/<path:filename> | endpoint static | methods ['GET', 'HEAD', 'OPTIONS'] | 转换器 {'filename': 'PathConverter'}
url_map.converters: ['any', 'default', 'float', 'int', 'path', 'string', 'uuid']
模板上下文处理器(None 键 = 所有蓝图): {None: ['_default_template_ctx_processor']}
before_request_funcs: {} | error_handler_spec: {}
app.cli 里额外注册的命令: []
static_folder=None 时的规则: []
flask --app appmod --help 列出的内置命令: ['limiter', 'routes', 'run', 'shell'] 刚构造完 __dict__ 里的 jinja_env / logger: False False
访问 app.jinja_env(第一次):0.02 ms,之后 __dict__ 里有: True
第二次访问:0.0007 ms
访问 app.logger(第一次):0.01 ms,logger 名 = appmod ,处理器数 1
访问这两项之后新增的 __dict__ 键: ['jinja_env', 'logger'] appmod import_name=appmod root_path=<项目> instance_path=<项目>/instance
pkg import_name=pkg root_path=<项目>/pkg instance_path=<项目>/instance
pkg.sub import_name=pkg.sub root_path=<项目>/pkg instance_path=<项目>/instance
直接 python run.py:
__name__ = __main__ | import_name = __main__ | root_path = <实验目录>/fltmp/f1b
Flask("totally.different.name")(这个模块不存在):
totally.different.name | root_path = <实验目录>/fltmp/f1bFlask(__name__) 构造:中位数 206 µs,最大 1403 µs(含首次)