Flask已定义端点返回404而非预期405的问题排查
Flask 2.x中PUT请求返回404而非405的原因及解决办法
问题原因
Flask 2.x版本对路由注册和匹配逻辑做了调整:
- 在1.x版本中,同一个URL的不同请求方法会被合并为一个路由条目,当收到未允许的方法时,框架会检查该URL是否存在其他合法方法,进而返回405(方法不允许)并附带
Allow响应头。 - 2.x版本中,每个指定了
methods的@app.route装饰器会注册一个独立的路由条目。当请求的方法没有对应的路由时,Flask不会去匹配同URL的其他路由,直接返回404(资源不存在)。
你的示例中,/test/分别注册了GET和POST两个独立路由,PUT请求找不到对应路由,因此返回404。
解决方案
方案1:合并同一URL的所有方法到单个视图函数
将同一URL的不同请求方法处理逻辑合并到一个视图函数中,通过methods参数声明所有允许的方法:
import flask app = flask.Flask("testapp") @app.route("/test/", methods=["GET", "POST"]) def test(): if flask.request.method == "GET": return 'get' elif flask.request.method == "POST": return 'post'
方案2:通过add_url_rule指定相同端点
使用add_url_rule手动注册路由时,为同一URL的不同方法指定相同的endpoint,让Flask识别为同一路由的不同方法:
import flask app = flask.Flask("testapp") def test_get(): return 'get' def test_post(): return 'post' # 指定相同的endpoint参数 app.add_url_rule("/test/", methods=["GET"], endpoint="test", view_func=test_get) app.add_url_rule("/test/", methods=["POST"], endpoint="test", view_func=test_post)
验证效果
修改后执行curl -XPUT http://127.0.0.1:5000/test,将返回405 Method Not Allowed,且响应头会包含Allow: GET, POST,符合预期。
内容的提问来源于stack exchange,提问作者user124114
相关产品推荐
相关产品推荐

