flask 官方教程中的create_app是怎么运行的?

今天在看flask的官方教程在第一部分,创建应用这里遇到一个问题,他在__init__.py创建了一个create_app的函数,然后写了一些配置信息,我并没有看到他调用,它是怎么跑起来的?我知道__init__.py这个文件会自动运行,但里面的创建的函数也会自动运行吗?官方代码如下

mkdir flaskr

flaskr/__init__.py

import os

from flask import Flask


def create_app(test_config=None):
    # create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
    SECRET_KEY='dev',
    DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)

if test_config is None:
    # load the instance config, if it exists, when not testing
    app.config.from_pyfile('config.py', silent=True)
else:
    # load the test config if passed in
    app.config.from_mapping(test_config)

# ensure the instance folder exists
try:
    os.makedirs(app.instance_path)
except OSError:
    pass

# a simple page that says hello
@app.route('/hello')
def hello():
    return 'Hello, World!'

return app

export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
这样就跑起来了,但是它是怎么跑起来的create_app是怎么调用的?
谢谢!

阅读 15.6k
4 个回答

看源码就行了,执行 flask run 的时候会执行如下代码:

def run_command(info, host, port, reload, debugger, eager_loading,
                with_threads, cert):
    debug = get_debug_flag()

    if reload is None:
        reload = debug

    if debugger is None:
        debugger = debug

    if eager_loading is None:
        eager_loading = not reload

    show_server_banner(get_env(), debug, info.app_import_path, eager_loading)
    app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)

    from werkzeug.serving import run_simple
    run_simple(host, port, app, use_reloader=reload, use_debugger=debugger,
               threaded=with_threads, ssl_context=cert)

通过 DispatchingApp 获取 Flask 实例,然后运行。

Flask.run 的部分代码:

def run(self, host=None, port=None, debug=None,
            load_dotenv=True, **options):
            ...
            run_simple(host, port, self, **options)

run_command
Flask.run

搜同样的问题搜到了这里,答案不是我想要的。

关键是这一句,export FLASK_APP=flaskr,如果工厂函数 create_app 换成除 make_app 之外的名字,比如 createApp,是运行不了的,要写成 export FLASK_APP=flaskr:createApp 才行,但是从来没见有提到 create_app 以及 make_app 这两个名字的特殊性,我的困惑就在这里。

其次是没有把参数传进去,如果没参数的话,只是原来那个默认的,写成工厂函数的意义就小了。使用 py 文件启动 flask,像这样

from flaskr import create_app
app=create_app(参数)
app.run()

这样就很明了,但是用命令行该怎么办?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏