Flask使用Blueprint时url_for调用路由为何需要加两个点前缀
问题原因说明与解决方案
核心原因
你遇到的报错本质是Blueprint初始化参数不符合规范+Flask端点命名空间规则共同导致的:
- Flask创建Blueprint时第一个参数为蓝图的唯一标识名,该名称会作为蓝图下所有视图函数端点的命名空间前缀,格式为
蓝图名.视图函数名。 - 你当前的代码
usr_routes = Blueprint("", __name__)将蓝图名设为空字符串,导致users视图的完整端点异常变为.users(空名称+点分隔符+视图名),非常规的user.users格式。
两点前缀生效的原因
Flask的url_for支持相对端点查找规则,前缀的点对应不同的查找范围:
- 无点前缀:默认在渲染当前模板的视图所属的命名空间下查找端点
- 单个点
.前缀:强制在当前所属的蓝图命名空间下查找 - 两个点
..前缀:强制跳过当前命名空间,到顶层全局命名空间查找端点
你当前渲染menu.html的视图属于根应用(无所属蓝图),默认查找的是无前缀的users端点,和实际存在的.users不匹配,所以会抛出BuildError;而加两个点后会匹配到顶层带点前缀的.users端点,因此可以正常生成链接。
更规范的修复方案
不建议长期使用两点前缀的写法,只需要给Blueprint设置合法的名称即可:
# 修改user_routes.py中的Blueprint初始化代码 usr_routes = Blueprint("usr", __name__)
后续模板中直接调用url_for('usr.users')即可正常生成链接,无需添加任何点前缀,可读性和可维护性更高。
内容的提问来源于stack exchange,提问作者Gameplay
相关产品推荐
相关产品推荐

