【发布时间】:2014-08-11 23:31:21
【问题描述】:
我想要几个应用工厂(目前:一个用于开发,另一个用于测试)。我想知道实现它们的正确方法是什么。
目前我使用 app 对象注册视图(通过 @app.route() 装饰器)。我是否需要开始使用蓝图(而不是应用程序)来注册视图?有没有办法在没有蓝客户的情况下拥有适当的应用工厂?
【问题讨论】:
标签: python flask flask-sqlalchemy
我想要几个应用工厂(目前:一个用于开发,另一个用于测试)。我想知道实现它们的正确方法是什么。
目前我使用 app 对象注册视图(通过 @app.route() 装饰器)。我是否需要开始使用蓝图(而不是应用程序)来注册视图?有没有办法在没有蓝客户的情况下拥有适当的应用工厂?
【问题讨论】:
标签: python flask flask-sqlalchemy
从技术上讲,您不需要蓝图,您只需在 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')
【讨论】:
你当然可以在没有蓝图的情况下拥有应用程序工厂,但这通常没有意义。
假设您有一个名为myapp 的应用程序包。
这是你的__init__.py:
from flask import Flask
def create_app():
app = Flask(__name__)
return app
现在我们在myapp 包之外创建一个名为autoapp.py(或wsgi.py 或manage.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即可。
对于那些在谷歌上搜索过这个问题的人。您不必使用蓝图。只需在您的 routes.py(或 views.py 等)中将 current_app 作为应用程序导入即可。
from flask import current_app as app
此外,您必须将其添加到工厂(create_app 函数)以注册您的路线:
with app.app_context():
from . import routes
【讨论】: