问题背景:写一个小demo,模块较多,需要蓝图管理。
项目结构大致如下:
├── app
│ ├── auth
│ │ ├── __init__.py
│ │ └── views.py
└── app.py
问题描述:在auth/__init__.py中定义了蓝图,在auth/views.py中引入蓝图,用它装饰了视图函数。在app.py中注册之后,开始运行,浏览器显示404,打印url_map,没有该蓝图装饰的路由。
代码如下:
auth/__init__.py
from flask import Blueprint
authbp=Blueprint('auth',__name__)
auth.views.py
from auth import authbp
@authbp.route('/login/',methods=['GET','POST'])
def login():
app.py
from auth import authbp
app.register_blueprint(authbp,url_prefix='/auth/')
问题定位:
定义及装饰过程没有错误,重点看注册。
注册过程参数正确,查看引入步骤。
引入时,直接从auth引入。从auth引入,相当于直接从auth/__init__.py引入。
此时的蓝图还未装饰视图函数。
总结根因:
蓝图定义时,并未将规则添加到defered_functions。此时直接注册,相当于调用add_url_rule,添加了空的规则。
修改:
引入装饰后的蓝图。
from auth.view import authbp