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

Django点击按钮执行Python脚本并在HTML页面展示输出问题求助

问题修复方案

核心错误排查

你现有代码无法返回脚本输出的原因有3个:

  • 调用subprocess.run()时未配置捕获标准输出/错误输出的参数,执行结果只会打印到服务器shell,不会被Python代码捕获
  • 主动把stderr重定向到了DEVNULL,就算脚本执行报错也会被直接吞掉,无法拿到错误信息
  • Django的render()方法第一个参数必须传入request对象,你漏传该参数会直接抛出参数错误,无法正常渲染页面

修正后的代码实现

1. Views.py 逻辑修改

import subprocess
from django.shortcuts import render

def Yellow(request):
    data1 = ""
    # 仅处理POST请求
    if request.method == "POST":
        inp = request.POST.get('param', "")
        try:
            # Python版本>=3.7用capture_output参数,低于3.7替换为stdout=subprocess.PIPE, stderr=subprocess.PIPE
            out = subprocess.run(
                ['python', '/yellow_page_updated.py', inp],
                capture_output=True,
                text=True,
                timeout=60 # 配置超时时间,防止脚本卡死服务器,可按需调整
            )
            # 拼接正常输出和错误输出,方便前端展示全部信息
            data1 = out.stdout + out.stderr
        except subprocess.TimeoutExpired:
            data1 = "脚本执行超时,请检查脚本逻辑"
        except Exception as e:
            data1 = f"执行出错:{str(e)}"
    # 注意render第一个参数必须传入request对象
    return render(request, 'Yellow_Page.html', {'data1': data1})

2. Yellow_Page.html 模板添加结果展示位

在你的页面对应位置添加如下代码,用于提交请求和展示结果:

<!-- 提交参数的表单,必须加csrf_token防止跨站请求校验失败 -->
<form method="post">
    {% csrf_token %}
    <input type="text" name="param" placeholder="请输入执行参数">
    <button type="submit">运行脚本</button>
</form>

<!-- 执行结果展示区域 -->
{% if data1 %}
<div style="margin-top: 20px;">
    <h4>脚本执行结果:</h4>
    <!-- pre标签保留输出的换行、空格格式 -->
    <pre style="background: #f5f5f5; padding: 10px; border-radius: 4px;">{{ data1 }}</pre>
</div>
{% endif %}

3. Urls.py 配置说明

你现有正则写法可正常运行,若使用Django 3.x+版本,也可改用更简洁的path写法:

from django.urls import path
from . import views

urlpatterns = [
    path('Yellow/', views.Yellow, name="Yellow"),
]

可选优化:实现实时逐行输出

如果不需要等脚本完全执行完再展示结果,想要执行过程中逐行输出到页面,可以改用StreamingHttpResponse实现流式响应,核心逻辑如下:

from django.http import StreamingHttpResponse
import subprocess

def yellow_stream(request):
    inp = request.GET.get('param', "")
    def output_generator():
        # 加-u参数关闭Python输出缓冲,确保实时拿到每一行输出
        proc = subprocess.Popen(
            ['python', '-u', '/yellow_page_updated.py', inp],
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            bufsize=1
        )
        for line in iter(proc.stdout.readline, ''):
            yield line
        proc.wait()
    return StreamingHttpResponse(output_generator(), content_type='text/plain')

前端配合AJAX请求该接口,逐行渲染内容即可。

内容的提问来源于stack exchange,提问作者Chris Jenkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:57:03