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

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消息也能正常在重定向后的页面渲染:

  1. 前端改用表单提交,新增隐藏字段_method值为PUT,同时开启Flask的MethodOverride中间件支持RESTful方法覆写
  2. 后端保持原来的重定向逻辑即可,无需额外修改JS。

方案2:保留AJAX,前端主动控制跳转

如果一定要用AJAX,后端不要返回重定向,改为返回JSON格式的跳转地址,前端接收到响应后主动触发整页跳转:

  1. 修改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')})
  1. 前端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 14:06:04