【问题标题】:django - iterating over return render_to_responsedjango - 迭代返回 render_to_response
【发布时间】:2012-07-31 22:54:07
【问题描述】:

我想读取一个文件,更新网站,阅读更多行,更新网站等等......逻辑如下,但它不起作用。 它只显示日志文件的第一行并停止。有没有办法迭代'return render_to_response'?

#django 视图调用远程 python 脚本,将输出附加到日志文件

proc = subprocess.Popen([program, branch, service, version, nodelist])
logfile = 'text.log'
fh = open(logfile, 'r')

while proc.poll() == None:
  where = fh.tell()
  line = fh.read()
  if not line:
     time.sleep(1)
     fh.seek(where,os.SEEK_SET)
  else:
     output = cgi.escape(line)
     output = line.replace('\n\r', '<br>')
     return render_to_response('hostinfo/deployservices.html', {'response': output})

感谢您的帮助。

【问题讨论】:

  • 哇。每次调用只能从函数返回一次。它甚至不是特定于 python 的
  • 您尝试做的事情很复杂,需要线程和 AJAX 投票......很难完整回答。
  • 这是一个响亮的“不”我接受它:)。哦,好吧,只是在尝试我的运气来寻找最简单的答案。返回谷歌搜索板。

标签: django subprocess render-to-response


【解决方案1】:

您实际上可以做到这一点,方法是让您的函数成为生成器——也就是说,使用 'yield' 来返回每一行。

但是,您需要直接创建响应,而不是使用渲染来响应。

【讨论】:

【解决方案2】:

render_to_response 将第一批渲染到网站并停止。然后,如果您想发送下一批,网站必须以某种方式再次调用此视图。您还必须记录您在日志文件中的位置,以便可以从该点读取第二批。
我假设您在模板中有一些逻辑,因此 render_to_response 的第二个帖子不会覆盖第一个
如果您的数据不是很庞大,您应该探索在每次阅读一些新行时发送您希望在网页上显示的全部内容。

【讨论】:

  • 由于日志很小,我正在考虑汇总输出“输出+=行”并每次更新...
  • 由于日志很小,我还是建议采用简单的解决方案,每次重新生成日志页面。
【解决方案3】:

不要重新发明轮子,而是使用django_logtail

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多