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
相关产品推荐
相关产品推荐

