Flask处理POST请求后如何重定向跳转至其他HTML页面
问题根因
你当前代码无法跳转的核心问题有两个:
- 视图函数中调用了
render_template但没有用return返回响应,Flask只有接收到视图函数return的内容才会把资源返回给前端,仅调用方法不会产生任何响应。 - 没有区分前端提交请求的方式:普通表单提交和AJAX异步提交的跳转逻辑完全不同,直接套同一种写法不会生效。
另外render_template不需要传static_folder参数,静态路径在Flask实例初始化时全局配置即可,传入该参数无效。
分场景解决方案
场景1:前端通过原生form表单提交(非异步)
这是最简单的场景,直接返回渲染后的目标页面即可,注意如果是普通表单提交,不要用request.get_json()取参数,要改用request.form获取表单字段:
@app.route('/test', methods=['POST']) def test(): # 普通表单提交用request.form拿参数,get_json仅适用于Content-Type为application/json的请求 form_data = request.form print(form_data) # 必须加return,将渲染完成的HTML返回给前端 return render_template('secondform.html')
如果你希望跳转后浏览器地址栏变更为目标页面的路径,可以用重定向方案,先写好目标页面的GET路由,再在POST处理逻辑中跳转:
from flask import redirect, url_for # 第二个页面的GET路由 @app.route('/second-form') def second_form(): return render_template('secondform.html') @app.route('/test', methods=['POST']) def test(): form_data = request.form print(form_data) # 重定向到目标页面 return redirect(url_for('second_form'))
场景2:前端通过AJAX/fetch/axios异步发POST请求
异步请求不会触发浏览器的默认页面跳转,就算后端直接返回HTML内容,也只会作为请求响应体被JS接收,不会替换当前页面。这种场景需要后端返回跳转标识,前端收到标识后主动触发页面跳转。
后端代码示例:
from flask import jsonify @app.route('/test', methods=['POST']) def test(): req_data = request.get_json() print(req_data) # 返回JSON格式的跳转地址 return jsonify({ "status": "success", "redirect": "/second-form" })
前端请求回调中加跳转逻辑,以fetch为例:
// 按钮点击触发的请求逻辑 fetch('/test', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(提交的参数对象) }) .then(res => res.json()) .then(res => { // 收到跳转标识后主动切换页面 if (res.redirect) { window.location.href = res.redirect } })
注意事项
- 所有要通过
render_template渲染的HTML文件,必须放在项目根目录的templates文件夹下,否则会触发模板找不到的404错误。 - 静态资源(JS/CSS/图片等)统一放在项目根目录的
static文件夹下,HTML中引用路径写/static/资源路径即可,不需要额外传参配置。 - 用原生表单提交的话,确认form标签的
method属性为post,action属性填写为/test。
内容的提问来源于stack exchange,提问作者U13-Forward
相关产品推荐
相关产品推荐

