如何在Flask框架中将execute函数的终端打印输出展示到前端网页
解决方案
方案一:一次性展示所有输出(无需修改原有execute的print代码,适合新手快速实现)
步骤1:配置Flask基础参数,添加SECRET_KEY(使用session的必备前提)
在你初始化app的代码下方新增SECRET_KEY配置,生产环境请替换为复杂随机字符串:
app = Flask(__name__) # 新增此行 app.config['SECRET_KEY'] = 'custom_random_string'
步骤2:捕获execute的print输出并存入session
先导入所需依赖:
from io import StringIO import sys from flask import session
修改index路由的执行逻辑,同时修复你原有代码里文件保存的小bug:
@app.route('/', methods=['GET', 'POST']) def index(): form = MyForm() if form.validate_on_submit(): # 提前在项目根目录新建upload文件夹存储上传的图片 for file in form.image.data: file.save(f'./upload/{file.filename}') # 捕获print输出的核心逻辑 old_stdout = sys.stdout output_buffer = StringIO() sys.stdout = output_buffer try: execute() # 将捕获到的输出存入session session['exec_logs'] = output_buffer.getvalue() finally: # 恢复终端标准输出,不影响后续后台打印 sys.stdout = old_stdout return redirect(url_for("process")) return render_template('index.html', user_form=form)
步骤3:修改process路由,将日志传递给模板
@app.route('/processing') def process(): # 取出日志后自动从session中清除,避免重复展示 exec_logs = session.pop('exec_logs', '') return render_template('process.html', exec_logs=exec_logs)
步骤4:修改process.html模板,渲染日志内容
{% extends 'base.html' %} {% block content %} <p style="text-align:center; font-size:50px; color:#77C66E">File uploaded successfully</p> <!-- 新增日志展示区域 --> <div style="width: 80%; margin: 20px auto; padding: 15px; background: #f5f5f5; border-radius: 8px; white-space: pre-wrap;"> <h3>执行日志:</h3> {{ exec_logs }} </div> {% endblock %}
方案二:实时输出执行进度(适合执行时间长的场景)
如果你的execute函数运行耗时较长,需要边执行边在前端展示输出,可以使用服务器发送事件(SSE)实现,核心逻辑为前端和后端建立长连接,后端每产生一条输出就推送给前端实时渲染,你可以自行搜索Flask SSE的相关实现逻辑。
内容的提问来源于stack exchange,提问作者eraisedtothepowerx
相关产品推荐
相关产品推荐

