首页 > 解决方案 > 启动服务器时 Flask 项目中的 _init_ 文件如何工作?

问题描述

我正在阅读Flask 教程并了解到在大型应用程序结构中,代码从单个app.py文件移动到文件中的“应用程序工厂函数” create_app_init_.py然后可以像这样启动服务器:

export FLASK_APP=flaskr
export FLASK_ENV=development
flask run

我想知道最后一个命令在幕后是如何工作的,因为在代码中的任何地方都没有明确调用这个工厂函数,因此没有返回应用程序?

另一个Flask 文档试图解释为什么使用这种项目结构,但在这种情况下,代码_init_.pyapp显式创建:

from flask import Flask
app = Flask(__name__)

import yourapplication.views

python 文档说:

需要init .py 文件才能使 Python 将目录视为包含包;这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏模块搜索路径上稍后(更深)出现的有效模块。在最简单的情况下,init .py 可以只是一个空文件,但它也可以执行包的初始化代码或设置 all变量,稍后将介绍。

最后一句提到了可以在第二种情况下应用的“初始化代码”(以及带有app.py文件的简单项目结构),但我未能将其应用于第一种情况。

标签: pythonflask

解决方案


烧瓶源代码中,他们检查是否存在调用的函数create_app

# Search for app factory functions.
for attr_name in ('create_app', 'make_app'):
    app_factory = getattr(module, attr_name, None)

    if inspect.isfunction(app_factory):
        try:
            app = call_factory(script_info, app_factory)

            if isinstance(app, Flask):
                return 

它甚至在文档中这样说:

Flask 会自动检测 myapp 中的工厂(create_app 或 make_app)。


推荐阅读