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

Flask-API可浏览界面DELETE按钮发送非预期请求问题求助

问题根因

原生HTML表单标准仅支持GET和POST两种提交方法,你在form标签上写method="DELETE"会被浏览器直接忽略,触发默认的GET提交行为,这也是你修改模板后出现带_method参数的GET请求的原因。
原来的Flask-API模板默认用POST方法提交、带_method=DELETE隐藏字段的设计是标准的REST兼容方案,只需要在Flask侧加方法覆写的处理逻辑即可,不需要修改库源码。


方案1:使用Werkzeug内置方法覆写中间件(推荐)

Werkzeug自带MethodRewriteMiddleware,可以自动识别POST请求中的_method参数,覆写请求的HTTP方法,适配RESTful路由要求。
修改你的启动代码,添加中间件即可:

from flask import request, url_for
from flask_api import FlaskAPI, status, exceptions
# 导入方法覆写中间件
from werkzeug.middleware.method_rewrite import MethodRewriteMiddleware

app = FlaskAPI(__name__)
# 注册中间件,指定识别的参数名为_method
app.wsgi_app = MethodRewriteMiddleware(app.wsgi_app, input_name='_method')

# 后续原有代码完全不用修改
notes = {
    0: 'do the shopping',
    1: 'build the codez',
    2: 'paint the door',
}

def note_repr(key):
    return {
        'url': request.host_url.rstrip('/') + url_for('notes_detail', key=key),
        'text': notes[key]
    }

# 原有路由代码保持不变

同时把你之前修改的Flask-API模板改回原来的method="POST"即可。


方案2:自定义请求钩子实现方法覆写

如果不想引入额外中间件,也可以自己写before_request钩子处理方法覆写逻辑,效果和中间件一致:

@app.before_request
def rewrite_request_method():
    if request.method == 'POST' and '_method' in request.form:
        override_method = request.form['_method'].upper()
        if override_method in ('PUT', 'DELETE', 'PATCH'):
            request.environ['REQUEST_METHOD'] = override_method

验证

修改完成后重启服务,点击页面的DELETE按钮,请求会被正确识别为DELETE方法,路由匹配正常,删除功能可以正常工作,和curl调用效果完全一致。

内容的提问来源于stack exchange,提问作者nixmind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:15:03