You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:15:29