Flask URL匹配问题:如何让/api/hello与/api/hello/均生效?
让Flask同时匹配带末尾斜杠和不带斜杠的URL
当然有办法啦!Flask提供了几种简单的方案,能让/api/hello和/api/hello/这两种URL都指向同一个视图函数,下面给你详细说说常用的几种方法:
方案一:全局关闭严格斜杠匹配
如果你希望所有路由都自动支持两种URL形式,不用逐个配置,可以在初始化Flask应用时,全局设置关闭严格斜杠匹配:
from flask import Flask app = Flask(__name__) # 全局设置所有路由忽略末尾斜杠的差异 app.url_map.strict_slashes = False @app.route('/api/hello') def hello(): return 'Hello! 不管你用/api/hello还是/api/hello/都能看到我~'
设置后,所有路由都会自动兼容带斜杠和不带斜杠的访问方式,省去了逐个路由调整的麻烦。
方案二:单个路由单独配置
如果只需要特定的几个路由支持两种URL形式,不想修改全局规则,可以在路由装饰器里单独添加strict_slashes=False参数:
from flask import Flask app = Flask(__name__) # 仅让这个路由兼容两种URL形式 @app.route('/api/hello', strict_slashes=False) def hello(): return 'Hello from either URL!'
这种方式更灵活,只会对当前设置的路由生效,其他路由依然遵循默认的严格匹配规则。
方案三:手动注册两个路由指向同一视图
这种方法更直观,就是给同一个视图函数注册两个不同的路由——一个带末尾斜杠,一个不带:
from flask import Flask app = Flask(__name__) # 同时注册两个路由,都指向hello函数 @app.route('/api/hello') @app.route('/api/hello/') def hello(): return 'Hello!'
这种方式的好处是你能清晰看到哪些URL会触发这个视图,适合需要明确控制路由列表的场景。
小补充
默认情况下,Flask的strict_slashes是True:如果你的路由是/api/hello,访问/api/hello/会返回301重定向到不带斜杠的版本;反之如果路由是/api/hello/,访问/api/hello会直接404。而上面的几种方案,要么关闭了严格匹配,要么直接注册了两个路由,就能避免这种情况,让两种URL都能正常返回内容。
内容的提问来源于stack exchange,提问作者Nkk
相关产品推荐
相关产品推荐

