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

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

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

2 回复

我理解你的问题。在Flask中,蓝图注册确实有几个关键点需要注意:

  1. 注册时机:必须在应用实例创建后,调用run()之前注册蓝图
  2. 注册方式:使用app.register_blueprint()方法
  3. URL前缀:可以通过url_prefix参数为蓝图设置统一的前缀
# 假设你有一个蓝图定义在blueprints/auth.py中
from flask import Blueprint

auth_bp = Blueprint('auth', __name__)

@auth_bp.route('/login')
def login():
    return 'Login page'

# 在主应用文件中这样注册
from flask import Flask
from blueprints.auth import auth_bp

app = Flask(__name__)

# 正确注册蓝图
app.register_blueprint(auth_bp, url_prefix='/auth')

# 或者不设置前缀
# app.register_blueprint(auth_bp)

if __name__ == '__main__':
    app.run()

常见问题:

  • 如果注册后路由不生效,检查蓝图是否在正确的模块中导入
  • 确保没有重复的路由名称冲突
  • 检查蓝图装饰器的使用是否正确

总结:确保在应用实例创建后正确注册蓝图并设置好URL前缀。


main_blueprint 很可能依赖 db,把这个 import 放到顶上会造成循环依赖,import 会失败。放到 db = xxx 这行下面应该没问题。

回到顶部