Flask PUT请求跳转报ERR_CONNECTION_RESET 如何实现GET跳转
问题解答
问题1:如何将重定向后的请求改为GET类型?
Flask默认redirect()函数返回的是302状态码,按照HTTP规范,针对PUT、POST等非GET/HEAD的原始请求,浏览器会复用原有请求方法访问重定向地址。要强制重定向后使用GET方法,只需在返回重定向时指定状态码为303 See Other,修改PUT接口的返回代码如下:
return redirect(url_for('requests.index'), code=303)
注意:这个修改仅解决重定向请求的方法问题,无法解决页面不跳转的问题,页面不跳转的核心原因和解决方法见下文。
问题2:兼容PUT后仍报错、模板不渲染的原因及解决方法
核心原因
你是通过AJAX发起的异步请求,后端返回的重定向指令只会被AJAX客户端接收处理,不会触发浏览器整页跳转/页面重渲染,你看到的连接重置报错,本质是重定向后的响应不符合AJAX异步请求的预期,逻辑层面你走的技术路径和需求不匹配。
正确实现方案(二选一即可)
方案1:替换AJAX为原生表单提交(最适配你的需求)
原生表单提交走浏览器标准请求流程,后端返回的重定向会直接触发整页跳转,flash消息也能正常在重定向后的页面渲染:
- 前端改用表单提交,新增隐藏字段
_method值为PUT,同时开启Flask的MethodOverride中间件支持RESTful方法覆写 - 后端保持原来的重定向逻辑即可,无需额外修改JS。
方案2:保留AJAX,前端主动控制跳转
如果一定要用AJAX,后端不要返回重定向,改为返回JSON格式的跳转地址,前端接收到响应后主动触发整页跳转:
- 修改PUT接口的返回逻辑:
from flask import jsonify @requests.route('/<request_id>', methods=['DELETE', 'GET', 'PUT']) def one_req(request_id): if (request.method == 'PUT'): req = ChangeRequest.query.get(request.form['request_id']) req.state = request.form['state'] try: db.session.commit() except: flash('There was an error updating the request.', 'error') else: flash('The request has been ' + request.form['state'].lower() + '.', 'success') # 异步请求返回JSON,不直接重定向 return jsonify({"redirect_url": url_for('requests.index')})
- 前端AJAX新增成功回调,主动触发页面跳转:
$.ajax({ url: `/requests/${data.request_id}`, data, type: 'PUT', success: function(res) { window.location.href = res.redirect_url } })
跳转后新的GET请求会自动读取session中存储的flash消息正常渲染,完全符合你的预期效果。
内容的提问来源于stack exchange,提问作者boing
相关产品推荐
相关产品推荐

