gpt4 book ai didi

python - Django:子进程连续输出到 HTML View

转载 作者:行者123 更新时间:2023-12-03 17:07:15 27 4
gpt4 key购买 nike

我的 Django 应用程序中需要一个 HTML 网页来加载并在可滚动框中显示脚本的连续输出。这可能吗?
我目前正在使用子进程来运行 Python 脚本,但 HTML 页面要等到脚本完成后才会加载(这可能需要大约 5 分钟)。我希望用户看到正在发生的事情,而不仅仅是一个旋转的圆圈。
我已经在文本中使用“\n”卸载了脚本的完整输出;如果可能的话,我希望它输出每个新行。
我的代码如下:
View .py:

def projectprogress(request):
GenerateProjectConfig(request)
home = os.getcwd()
project_id = request.session['projectname']
staging_folder = home + "/staging/" + project_id + "/"
output = ""
os.chdir(staging_folder)
script = home + '/webscripts/terraformdeploy.py'
try:
output = subprocess.check_output(['python', script], shell=True)
except subprocess.CalledProcessError:
exit_code, error_msg = output.returncode, output.output
os.chdir(home)
return render(request, 'projectprogress.html', locals())
项目进度.html:
<style>
div.ex1 {
background-color: black;
width: 900px;
height: 500px;
overflow: scroll;
margin: 50px;
}
</style>

<body style="background-color: #565c60; font-family: Georgia, 'Times New Roman', Times, serif; color: white; margin:0"></body>
<div class="ex1">
{% if output %}<h3>{{ output }}</h3>{% endif %}
{% if exit_code %}<h3> The command returned an error: {{ error_msg }}</h3>{% endif %}
</div>
<div class="container">
<a class="button button--wide button--white" href="home.html" title="Home" style="color: white; margin: 60px;">
<span class="button__inner">
Home
</span>
</a>
</div>
</body>
</html>

最佳答案

您可以使用 StreamingHttpResponse 来简化您的任务。和 Popen :

def test_iterator():
from subprocess import Popen, PIPE, CalledProcessError

with Popen(['ping', 'localhost'], stdout=PIPE, bufsize=1, universal_newlines=True) as p:
for line in p.stdout:
yield(line + '<br>') # process line here

if p.returncode != 0:
raise CalledProcessError(p.returncode, p.args)

def busy_view(request):
from django.http import StreamingHttpResponse
return StreamingHttpResponse(test_iterator())
StreamingHttpResponse期望一个迭代器作为它的参数。迭代器函数是具有 yield 的函数。表达式(或生成器表达式),其返回值是生成器对象(迭代器)。
在这个例子中,我只是简单地回显 ping 命令来证明它有效。
替补 ['ping', 'localhost']通过列表(如果您将参数传递给命令,它必须是列表 - 在本例中为 localhost )。您的原创 ['python', script]应该管用。
如果您想了解更多关于生成器的信息,我会推荐 Trey Hunner 的 talk ,并且强烈建议您阅读 Fluent Python 的第 14 章书。两者都是惊人的来源。
免责声明:

Performance considerations

Django is designed for short-lived requests. Streaming responses willtie a worker process for the entire duration of the response. This mayresult in poor performance.

Generally speaking, you should perform expensive tasks outside of therequest-response cycle, rather than resorting to a streamed response.

关于python - Django:子进程连续输出到 HTML View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63035915/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com