Flask如何实现渲染页面后根据脚本执行结果跳转至外部站点
问题根源
你写的代码无法执行跳转是因为HTTP协议要求一个请求只能返回一次响应,当你调用return render_template(...)之后,当前请求的处理流程已经结束,后面的sleep和redirect代码完全不会被执行。而且后端的sleep只会卡住请求响应,无法实现前端展示内容后延时跳转的效果,这个逻辑必须放到前端页面实现。
解决方案
1. 调整Flask后端代码
首先修改视图逻辑,把ping命令的退出码、执行结果都传给模板,同时调整subprocess的调用方式避免命令注入风险:
import subprocess from flask import request, render_template, redirect @app.route("/result", methods=['POST','GET']) def result(): if request.method == "POST": ip1 = request.form.get('ip') # 改用列表传参的方式调用subprocess,避免命令注入 ping_result = subprocess.run( ['ping', '-c', '2', str(ip1)], capture_output=True, text=True ) out = ping_result.stdout + ping_result.stderr ec = ping_result.returncode # 把退出码和输出都传给模板 return render_template("home.html", out=out, ec=ec) # GET请求的逻辑可根据自身业务补充 return redirect('/')
2. 修改home.html模板
在模板里根据退出码判断是否需要自动跳转,成功则添加延时跳转逻辑,失败则只展示错误信息:
<!DOCTYPE html> <html> <head> <title>Ping结果</title> {% if ec == 0 %} <!-- 退出码为0表示ping成功,设置3秒后跳转,url可替换为你需要的目标地址 --> <meta http-equiv="refresh" content="3;url=http://www.google.com"> {% endif %} </head> <body> {% if ec == 0 %} <p>* ping执行成功,3秒后将自动跳转</p> {% else %} <p>* ping执行失败,错误信息如下:</p> {% endif %} <pre>{{ out }}</pre> </body> </html>
逻辑说明
- ping命令的退出码
0代表执行成功,非0代表执行失败,我们直接用这个状态做判断条件 - 前端通过meta标签的refresh属性实现延时跳转,不需要额外写JS,兼容性最好
- 整个流程只需要一次后端响应,符合HTTP协议的要求
内容的提问来源于stack exchange,提问作者shreesh
相关产品推荐
相关产品推荐

