将stdio传输到一个网站(如buildbot)

时间:2011-08-23 19:42:58

标签: python django stdio

所以我尝试在stdio流中处理类似于Buildbot的webapp。有谁知道Buildbot如何处理stdio?它是流式传输(看起来似乎),这正是我对此程序所需要的。

有谁知道怎么做?

非常感谢任何帮助。

我正在使用Python和Django

2 个答案:

答案 0 :(得分:0)

Buildbot使用Twisted,它与Django的编程风格截然不同。

我会说你必须在Twisted中写一个服务来做你想要的事情。从Django与它进行通信,让它做你需要的流媒体部分。

(在Django中,作为大多数Web应用程序,每个请求都有一个线程/调用阻塞db / io调用。在Twisted中,你将异步函数调用推迟到库并且在io后继续回调已经完成了。一开始感觉有点奇怪,但它实际上非常好,特别是对于那些不仅仅是网络服务器的应用程序。)

答案 1 :(得分:0)

Django允许您从视图中返回迭代器。您可以返回一个迭代器,该迭代器逐步读取流并将其返回到django。 request-response/#passing-iterators ex. snippet

这是最简单的解决方案

from django.core.servers.basehttp import FileWrapper
from subprocess import Popen, PIPE
from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser) #SECURE THIS SHIT
def stdout_cmd(request, command):
              #buffsize=1 reads a char at a time
    process = Popen(command, shell=True, buffsize='1', stdout=PIPE)
              # FileWrapper creates an iterator class for stdout
    wrapper = FileWrapper(process.stdout)
              # text/plain causes monospaced output in browser
    return HttpResponse(wrapper, content_type='text/plain')

只要您可以创建类似文件的对象,就可以将其包装在FileWrapper中。 请注意,如果shell的输出是偶发的,您将需要创建自己的迭代器,一次读取一行,例如。

wrapper = (line for line in process.stdout) # brackets create an iterator object

注意:如果加载的并发长轮询页面太多,这将消耗工作线程并阻止连接到服务器的人员。使用gevent / greenlets的考虑者。适用于高流量环境。