bigywater.tech
Flask · 1

Flask(__name__) 到底初始化了什么

一行 app = Flask(__name__) 背后,应用对象到底拥有什么?哪些是此刻就创建好的,哪些要等用到才创建?这篇逐项打印出来看。

29
默认 config 的键数
1
构造时自动注册的路由(/static/)
206 µs
构造一个 Flask 对象的中位数耗时

构造后的属性

实测 · 本机执行输出
  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']

root_path 与 instance_path

实测 · 本机执行输出
    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/f1b

构造耗时

实测 · 本机执行输出
  Flask(__name__) 构造:中位数 206 µs,最大 1403 µs(含首次)

分步演示

Flask 对象
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:Flask 在 Python 其它版本上的行为、instance_path 在已安装包(site-packages)里的取值规则、第三方插件通过 entry point 注册 flask 命令的机制、config 里各键在 Flask 其它版本中的默认值差异
    京ICP备2026067502号-1京公网安备11010502063487号