【问题标题】:Flask: are blueprints necessary for app factories?Flask:应用工厂需要蓝图吗?
【发布时间】:2014-08-11 23:31:21
【问题描述】:

我想要几个应用工厂(目前:一个用于开发,另一个用于测试)。我想知道实现它们的正确方法是什么。

目前我使用 app 对象注册视图(通过 @app.route() 装饰器)。我是否需要开始使用蓝图(而不是应用程序)来注册视图?有没有办法在没有蓝客户的情况下拥有适当的应用工厂?

【问题讨论】:

    标签: python flask flask-sqlalchemy


    【解决方案1】:

    从技术上讲,您不需要蓝图,您只需在 create_app 函数上注册每条路线即可。一般来说,这不是一个好主意,这就是蓝图存在的原因。

    没有蓝图的示例

    def create_app():
      app = Flask(__name__)
    
      @app.route('/')
      def index():
        return render_template('index.html')
    
      return app
    

    如果您以这种方式进行配置,您可以拥有一个用于测试和其他任何东西的应用工厂。如果你想根据它是否在测试中加载不同的蓝图,你可以这样做。

    from project.config import configurations as c
    
    def create_app(config=None):
      " make the app "
      app = Flask(__name__)
      app.config.from_object(c.get(config, None) or c['default'])
    
      configure_blueprints(app)
    
      return app
    
    def configure_blueprints(app):
      " register the blueprints on your app "
      if app.testing:
        from project.test_bp import bp
        app.register_blueprint(bp)
      else:
        from project.not_test_bp import bp
        app.register_blueprint(bp)
    

    那么project/config.py可能是这样的:

    class DefaultConfig(object):
      PROJECT_NAME = 'my project'
    
    class TestingConfig(DefaultConfig):
      TESTING = True
    
    class DevConfig(DefaultConfig):
      DEBUG = True
    
    configurations = {
      'testing': TestingConfig,
      'dev': DevConfig,
      'default': DefaultConfig
    }
    

    为每个蓝图创建一个文件夹,其中文件夹中的__init__.py 实例化蓝图。假设有一个名为 routes

    的蓝图
    from flask import Blueprint
    
    bp = Blueprint('routes', __name__)
    
    from project.routes import views
    

    然后在project/routes/views.py,你可以发表你的看法。

    from project.routes import bp
    
    @bp.route('/')
    def index():
      return render_template('routes/index.html')
    

    【讨论】:

      【解决方案2】:

      你当然可以在没有蓝图的情况下拥有应用程序工厂,但这通常没有意义。

      假设您有一个名为myapp 的应用程序包。 这是你的__init__.py

      from flask import Flask
      
      def create_app():
          app = Flask(__name__)
      
          return app
      

      现在我们在myapp 包之外创建一个名为autoapp.py(或wsgi.pymanage.py 等)的新.py 文件。在autoapp.py 中,您创建应用程序实例并从myapp 导入视图:

      from myapp import create_app
      
      app = create_app()
      
      from myapp import views
      

      导入语句会将app 与您的路线链接。您可以像这样在views.py 中导入app

      from autoapp import app
      
      @app.route('/')
      def index():
          return 'Hello!'
      

      应用结构:

      myapp/
          myapp/
              __init__.py
              views.py
          autoapp.py
      

      【讨论】:

      • 循环导入呢?
      • 我把from myapp import views放在autoapp.py的底部以避免它。
      • 对于非常小的应用程序,您会推荐这种方法而不是蓝图吗?
      • 对于小型应用,你可能根本不需要使用应用工厂,只需将所有内容放入app.py即可。
      【解决方案3】:

      对于那些在谷歌上搜索过这个问题的人。您不必使用蓝图。只需在您的 routes.py(或 views.py 等)中将 current_app 作为应用程序导入即可。

      from flask import current_app as app
      

      此外,您必须将其添加到工厂(create_app 函数)以注册您的路线:

      with app.app_context():
          from . import routes
      

      【讨论】:

      • 这似乎解决了我的问题,但没有文档表明这是一个好习惯?
      猜你喜欢
      • 2018-07-17
      • 1970-01-01
      • 2019-03-08
      • 2012-01-20
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多