使用Blueprints和Flask 1.0+从__init__.py create_app()访问应用的最佳方法

时间:2018-11-06 15:24:27

标签: python flask

我对Flask 1.0的更改有些困惑。 文档建议在__init__.py中为应用创建工厂,其中app=create_app(config_file)run.py调用。

现在在Flask的先前版本中,我可以from application import app说一个蓝图控制器,因为应用程序不是从create_app()返回的。我无法再次致电create_app(),但无法访问@app.routeapp.config等,等等。

我已经尝试过并且在推广环境方面没有成功。现在有多种不太好的方法可以做到这一点,但是什么是“规范的”方法呢?

1 个答案:

答案 0 :(得分:0)

application factory的概念在Flask 1.0中并不陌生。如果您的应用不需要工厂,则不必使用工厂。

如果您确实使用应用程序工厂,则通常不会直接在该应用程序上注册任何路由。您将创建一个蓝图,注册到该蓝图的路线,然后在应用程序工厂中将该蓝图附加到该应用程序。

在任何需要访问应用程序配置的地方,您都可以使用current_app proxy

例如,在应用程序的views.py模块中,您可以为视图创建一个蓝图;我提供了使用current_app来访问配置的示例:

from flask import Blueprint, current_app

bp = BluePrint('main', __name__)

@bp.route(...)
def some_route_name(...):
    # ...
    if current_app.config['SOME_CONFIGURATION_SETTING']:
        # ...

您将向其中注册蓝图

def create_app(config_filename=None):
    app = Flask(__name__)

    # configuration setup, use the confuration module as a default
    from . import configuration
    app.config.from_object(config)
    app.config.from_envvar("PROJECTNAME_SETTINGS", silent=True)
    if config_filename is not None:
        app.config.from_pyfile(config_filename)

    from . import views
    app.register_blueprint(views.bp)

    # other registrations

    return app