启动服务器时,Flask项目中的_init_文件如何工作?

时间:2018-12-13 08:54:30

标签: python flask

我正在阅读Flask tutorial,并了解到在大型应用程序结构中,代码已从单个app.py文件移动到create_app文件中的“应用程序工厂功能” _init_.py ,则服务器可以像这样启动:

export FLASK_APP=flaskr
export FLASK_ENV=development
flask run

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

另一个Flask doc试图解释为什么使用这种项目结构,但是在这种情况下,_init_.py中的代码显式创建了app

from flask import Flask
app = Flask(__name__)

import yourapplication.views

python doc说:

  

init .py文件是使Python处理   目录包含软件包;这样做是为了防止   具有常见名称(例如字符串)的目录   隐藏模块搜索中稍后出现的有效模块(更深)   路径。在最简单的情况下, init .py只能是一个空文件,但是   它也可以执行包的初始化代码或设置   所有变量,稍后说明。

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

1 个答案:

答案 0 :(得分:0)

flask source code中,他们检查是否存在称为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 

它在documentation中也是如此:

  

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