2014-04-18 31 views
0

在我的应用程序中,用户可以从接口启动一个爬行动作,这个动作将在服务器端的线程中执行。该抓取在while循环中执行,并将发送一些信息(目前,作为控制台中的打印)。从服务器发送信息到查看而不重新加载django

我想要做的就是将控制台中显示的这些信息发送到视图。此图总结过程

View          Server 
    |           | 
    | Call the async function with ajax | crawl Thread 
    |---------------------------------------->|------------>| 
    |           |    | 
    |           |    | 
    |   send back information   | information | 
    |<----------------------------------------|<------------| 
    |           |   ... 
    |------|         | 
    |  | refresh view     ... 
    |  | 
    |<------ 
...   

有没有办法做到这一点?我不知道如何做到这一点(信号?websockets?)
谢谢!

+0

阅读有关它在这里请http://stackoverflow.com/questions/6599783/django-frontend-to-run-subprocess-output-to-browser-window –

+0

如何“企业”你在找什么?有更快的黑客攻击,但如果你正在寻找一个可扩展的解决方案,有办法用celery/rabbitmq来处理后端,然后可能使用nodejs或gevent(或其他功能)来处理websocket(它将允许您进行异步调用,然后从服务器推送) – Foon

+0

Eugene:我的主要问题是不显示终端的结果,它是从服务器向视图发送异步响应,无需重新加载页面。 Foon:嗯,它取决于已被参数化的抓取延迟,它可能是一个从服务器发送到视图的消息,每个小时可能是每10秒钟一次。 我已经听说过芹菜,但从未使用它。从我关于nodejs的红色来看,它是面向Javascript服务器的,所以如果我没有错,我可以从服务器向视图发送异步响应? – Kobz

回答

0

基本上可以采取两种方法:轮询或推送。

如果你要轮询,哪一个更容易,你可以使用几种方法,从用jQuery更新DOM到更优雅的东西,比如Knockout.js中的Observable/ObservableArrays。

如果你打算推,我会推荐使用socket.io和Redis以pub/sub方式。

无论哪种方式,您最终都会使用JavaScript来更新DOM。

+0

我想要做的是推动而不是轮询,基本上,它是在web界面中显示的“终端状”,显示由服务器执行的异步操作的结果(预定爬网的结果)。我设法设立芹菜为了爬行。 我希望有一种实时结果,这就是为什么我不能进行轮询的原因,因为会有一个时间间隔(来自客户端的两个请求之间),我必须按顺序等待下一个请求有新的信息。 – Kobz

+0

Gotcha。如果您将这些操作的结果存储在缓存中(例如Redis等),则可以按计划或在可用时立即将这些信息推送给客户端。 – Brandon

+0

经过一番研究,我选择了最后做一个简单的投票。为什么?因为我非常伤心(不要说些粗俗的话),看到诸如Socket IO,redis-py,pika等不可或缺的工具与Python 3(2008年发布)仍然不兼容。 – Kobz

相关问题