Python 如何使用django rest框架在网页上打印bash脚本的结果
我是django(DRF)的新手,我想使用视图和模板打印脚本“myscript.sh”的结果。 我尝试了以下方法,但无效: 在myapp/views.py中:Python 如何使用django rest框架在网页上打印bash脚本的结果,python,django,Python,Django,我是django(DRF)的新手,我想使用视图和模板打印脚本“myscript.sh”的结果。 我尝试了以下方法,但无效: 在myapp/views.py中: class TestView(TemplateView): template_name = 'index.html' def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/plain')])
class TestView(TemplateView):
template_name = 'index.html'
def application(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
proc = subprocess.Popen("./myscript.sh", shell=True, stdout=subprocess.PIPE)
line = proc.stdout.readline()
while line:
yield line
line = proc.stdout.readline()
在myapp/templates/index.html中:
<html>
<head>
<title> Lines </title>
</head>
<body>
<p> {{ line }} </p>
</body>
</html>
线
{{line}}
您可能忘记了从视图返回响应
return Response({"line": line})
首先,这里没有使用DRF中的任何内容,只使用普通的Django
其次,Django(或任何其他框架)中的视图本身不是WSGI应用程序。定义application()
方法没有意义,因为视图永远不会调用它
最后,您不能使用yield返回迭代器,但同时希望呈现模板。模板是一次性呈现的,因此您需要拥有模板的所有数据
您应该在单个列表变量中一次返回所有响应,而不是逐行返回。您应该在get\u context\u data
方法中执行此操作,该方法返回包含该列表的dict。然后,在您的模板中,您将迭代该列表。谢谢您的回答Python,但我们不应该在使用get时使用return,如果我们这样做,我们将得到一个语法错误:(“'return'带参数在生成器中“,)视图:类executView(TemplateView):模板名称='execut.html'def get_context_data(self,**kwargs):context=super(executeview,self)。获取上下文数据(**kwargs)context['list']=subprocess。检查输出(“./wtm.sh”,stderr=subprocess.STDOUT,shell=True)返回上下文和html:Response{%for list%}{element}{%endfor%}感谢您的回答,我使用yield是因为我希望看到脚本的执行过程,因为它需要一段时间才能完成。我使用get_context_数据修改了代码,它可以正常工作。