请教个 flask web development 书中关于 blueprint 注册的问题

2017-06-28 10:08:34 +08:00
 Tianny
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_moment import Moment
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
db = SQLAlchemy()


def create_app(config_name):
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    bootstrap.init_app(app)
    mail.init_app(app)
    moment.init_app(app)
    db.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

上面例子是 flask web development 书中的 7-3 的引用,from .main import main as main_blueprint是在 create_app 中导入已定义的 blueprint,已定义的 blueprint 的名称是 main。我的问题是这段代码可以加到这个例子的最上面么?跟开头的其他 import 语句放在一起,而不是放在 create_app 这个函数中。之所以有这样的疑问,因为书中有提到包的循环导入的问题,放在 create_app 中,是为了解决包循环导入的问题么?

附加下项目的目录结构

.
|______init__.py
|____email.py
|____main
| |______init__.py
| |____errors.py
| |____forms.py
| |____views.py
|____models.py
|____static
| |____favicon.ico
|____templates
| |____404.html
| |____500.html
| |____base.html
| |____index.html
| |____mail
| | |____new_user.html
| | |____new_user.txt
1628 次点击
所在节点    Python
2 条回复
guyskk
2017-06-28 10:17:25 +08:00
main_blueprint 很可能依赖 db,把这个 import 放到顶上会造成循环依赖,import 会失败。放到 db = xxx 这行下面应该没问题。
Tianny
2017-06-28 10:37:06 +08:00
@guyskk 感谢!你的意思我懂了。是我的思维太局限了。也可以这样说,create_app()中里可能会注册多个 blueprint。而每个 blueprint 都可能依赖 db,mail 等各种扩展实例,所以放在 create_app()函数中 import blueprint 是最稳妥的方法,因为在 create_app()函数之前已经导入了各种模块和创建了所需的扩展实例了,也就不会造成循环依赖了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/371591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX