WebSocket + Django python WebService

13
我想知道如何使用websockets创建一个django webservice(响应XML)。我已经有了一个django webservice,它接受XML请求、解析请求、进行数据库查询、创建响应XML并将XML发送回请求方/浏览器。这只是一个正常的HTTP XML请求,响应在浏览器中以XML形式显示。
但是,如果我现在想创建一个websocket django webservice,该怎么办?假设我希望在发生新的魔法事件时向请求者/浏览器发送包含最新数据库数据的XML响应。
我已经阅读了很多帖子和博客,但都太笼统了。我能否仅使用django+apache来解决此问题,还是需要除django之外的其他服务器来处理websockets?
我现在正在使用django 1.3、Apache+wsgi,但我可以随时切换到任何有效的配置。
更新:
有许多不同的websockets可供选择,http://pypi.python.org/pypi?:action=search&term=websocket&submit=search ,但在我的情况下,哪个可以使用?
3个回答

9

抱歉,Django处理异步请求非常糟糕,因为它是WSGI。如果您必须处理真实用户,则将受到并行实例数量的限制。最好的解决方案是使用tornado或node.js。

Tornado出色地处理Websocket和长轮询。这是我的包装器,允许从并行Tornado线程中获取用户和会话:

https://gist.github.com/1939836

它是从更复杂的源代码适配而来的。我没有测试过这个要点,但它可以进行长轮询,而且Tornado也能处理WebSocket。

http://www.tornadoweb.org/documentation/websocket.html

更新:

避免在生产中使用django-websocket。即使主要开发人员也不建议这样做。

我推荐Tornado,因为它是一个比Django更快/更轻的神奇技术。对于某些简单情况可能非常有用。无论如何,您都需要配置apache/nginx,以便至少获得“更快的网页”功能。

Django-Desktop-Notification专注于Chrome浏览器并需要node.js。

更新(01/2016):

2015年底Mozilla为Django提供了资金,以解决这个特定问题,目前最有前途的实现是由Django核心开发人员完成的:

https://github.com/andrewgodwin/channels

它可能会成为Django 1.11或2.0的一部分。


谢谢你的回答。我必须尽一切可能避免轮询。客户端不应该向服务器请求新的更新。我将在我的第一篇帖子中更新一个“可能存在的实现”列表,但我不确定哪一个适用于我的情况。 - Gero
长轮询是真正的实时通信,只有在需要时才发送答案。但是您拥有所有必要的工具来实现Tornado异步服务器和Django之间的通信。如果使用Django ORM,请避免从Tornado访问数据库,因为它由阻塞调用构成。 - christophe31
我刚刚阅读了有关长轮询的RFC,但我将选择WebSockets。需要其中一种能够与Django一起使用的实现。 - Gero
我向您展示的Tornado Gist允许您在Tornado服务器中使用Django请求对象和库。 - christophe31
谢谢Ross,作为一个法国人,我很感激语法纠正,我知道我需要它。但是我不能点赞它;-) - christophe31

7
虽然设置有点复杂(但可能是最好的方法),您可以使用gunicorn + gevent + socket.io。
我使用this article指导我的方式。
您还可以查看服务器发送事件(上述文章也介绍了这一点)。如果它们适合您的需求,那么设置会更容易 - 因为您不需要设置socket.io并且不需要客户端库。但有一个注意点 - IE不支持SSE。

0

嗯,当涉及到异步处理时,Django并不是非常出色。我建议你使用Twisted,因为它有很多WebSocket库。如果你真的需要使用Django...你可以让Django作为一个中转站,用于所有使用Twisted构建的API。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接