Python中Flask框架如何处理两个蓝图url_prefix和route都相同的冲突?
如题,在使用 Flask 时突然产生的困惑,有大佬知道吗?
Python中Flask框架如何处理两个蓝图url_prefix和route都相同的冲突?
8 回复
试试不就知道了吗?
在Flask里,如果两个蓝图注册了相同的url_prefix,并且它们内部还有同名的route,那后注册的蓝图会直接覆盖掉先注册的。Flask的URL映射规则是后到先得,同一个URL只能对应一个视图函数。
看这段代码就明白了:
from flask import Flask, Blueprint
app = Flask(__name__)
# 创建第一个蓝图
bp1 = Blueprint('bp1', __name__, url_prefix='/api')
@bp1.route('/hello')
def hello_bp1():
return "Hello from Blueprint 1"
# 创建第二个蓝图,url_prefix相同
bp2 = Blueprint('bp2', __name__, url_prefix='/api')
@bp2.route('/hello') # route路径也相同
def hello_bp2():
return "Hello from Blueprint 2"
# 注册蓝图
app.register_blueprint(bp1)
app.register_blueprint(bp2) # 这个会覆盖上面的
if __name__ == '__main__':
print(app.url_map) # 查看URL映射,只有一个 /api/hello
app.run()
运行后访问 /api/hello,只会看到"Hello from Blueprint 2"。app.url_map 也会显示只有一个对应的规则。
要解决这个,要么改url_prefix让它们不同,比如一个/api/v1一个/api/v2;要么在同一个蓝图里管理所有/api下的路由。别让它们撞车就行。
总结:后注册的蓝图会覆盖先注册的。
按照逻辑,两个蓝图注册有先后,先注册的触发了后面的就不会继续了,就是这样。
所以路由,特殊的放前面,通用的放后面
估计启动不了,抛出 duplicate blueprint prefix 之类
试试不就知道了?
endpoint ?
好像会有个 endpoint 重复的错误, 然后需要自己设置不同的 endpoint.


