我想拥有几个应用工厂(目前:一个用于开发,另一个用于测试)。我想知道实现它们的正确方法是什么。
目前我使用app对象来注册视图(通过@app.route()
装饰器)。我是否需要开始使用蓝图(而不是app)来注册视图?有没有办法让没有蓝色职业的合适的应用工厂?
答案 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.py
或manage.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