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中,蓝图注册确实有几个关键点需要注意:
- 注册时机:必须在应用实例创建后,调用
run()之前注册蓝图 - 注册方式:使用
app.register_blueprint()方法 - 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 这行下面应该没问题。

