Python 如何使用django rest框架在网页上打印bash脚本的结果

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')])

我是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')])
      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_数据修改了代码,它可以正常工作。