我正在使用应用程序工厂初始化我的应用程序。在其中,我导入了所有蓝图并逐一注册。有没有一种方法可以将import和register语句移到其他文件,或将它们通知工厂,而无需单独引用它们?
def create_app(config_filename):
app = Flask(__name__)
app.config.from_object(config_filename)
from app.users.models import db
db.init_app(app)
from app.users.views import users
from app.posts.views import posts
app.register_blueprint(posts, url_prefix='/posts')
app.register_blueprint(users, url_prefix='/users')
return app
在我的项目中,我实际上是在用另一个脚本生成蓝图,因此我也希望能够通过附加到文件或其他内容来生成注册,而不是尝试在工厂中修改代码。
是的,您可以在其他模块中导入和注册蓝图。但是这种方法没有实际意义,它只是将导入操作和调用调用注册到其他位置。
myapp/blueprints.py
:
from app.users.views import users
from app.posts.views import posts
def init_app(app):
app.register_blueprint(users, prefix='/users')
app.register_blueprint(posts, prefix='/posts')
myapp/__init__.py
:
def create_app():
app = Flask(__name__)
# ...
from myapp import blueprints
blueprints.init_app(app)
# ...
可能更有用的方法是告诉应用程序要从中导入哪些软件包,并让应用程序期望在某个标准位置为每个软件包找到一个蓝图。假设blueprint变量将始终与包具有相同的名称,在中定义views
,并且与名称具有相同的前缀:
from werkzeug.utils import import_string
def create_app():
app = Flask(__name__)
# ...
for name in ('users', 'posts'):
bp = import_string('myapp.{0}.views:{1}'.format(name, name))
app.register_blueprint(bp, prefix='/{0}'.format(name))
# ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句