Flask:app工厂需要的蓝图吗?

时间:2014-08-11 23:31:22

标签: python flask flask-sqlalchemy

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

目前我使用app对象来注册视图(通过@app.route()装饰器)。我是否需要开始使用蓝图(而不是app)来注册视图?有没有办法让没有蓝色职业的合适的应用工厂?

3 个答案:

答案 0 :(得分:15)

从技术上讲,您不需要蓝图,只需在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')

答案 1 :(得分:3)

你肯定可以拥有没有蓝图的应用工厂,但这通常没有意义。

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

from flask import Flask

def create_app():
    app = Flask(__name__)

    return app

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

from myapp import create_app

app = create_app()

from myapp import views

import语句会将app与您的路线相关联。您可以在app中导入views.py,如下所示:

from autoapp import app

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

申请结构:

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

答案 2 :(得分:1)

对于那些用谷歌搜索的人。您不必使用蓝图。只需将current_app作为apps导入到您的routes.py(或views.py,无论如何)中,您就可以自由使用。

from flask import current_app as app

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

with app.app_context():
    from . import routes