WebSocket + Django python WebService

时间:2012-02-28 21:08:11

标签: python django websocket

我想知道如何使用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但我准备切换任何可行的配置。

更新

那里有很多可能的网页框, http://pypi.python.org/pypi?:action=search&term=websocket&submit=search 但在我的情况下可以使用哪一个?

3 个答案:

答案 0 :(得分:8)

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

Tornado处理websocket和长时间的轮询。这是我的包装器,允许从并行龙卷风线程中获取用户和会话:

https://gist.github.com/1939836

它是从一个更复杂的来源改编而来,我没有测试过这个要点,它是长期轮询,但也是龙卷风手工WebSocket。

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

<强>更新

避免使用django-websocket进行生产。即使是主要的开发者也反对它。

我推荐龙卷风,因为它是一种非常棒的技术,它比django更快/更轻。它可能对一些简单的情况有用。无论如何你都需要配置apache / nginx,至少可以获得“更快的网页”功能。

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

更新(01/2016):

Mozilla在2015年底向django捐款以解决这个特殊问题,django核心开发者目前最有希望实现的是这个:

https://github.com/andrewgodwin/channels

它可能是django 1.11或2.0的一部分

答案 1 :(得分:7)

虽然设置有点复杂(但可能还有其他方法),你可以使用gunicorn + gevent + socket.io。

我使用this article指导我的方式。

您也可以查看服务器发送的事件(上面提到的文章也是如此)。如果它们符合您的需求,设置会更容易一些 - 因为您不必设置socket.io而您不需要客户端库。但是有一个问题 - IE中不支持SSE。

答案 2 :(得分:0)

是的,当谈到异步的东西时,django并不是那么好。我对你的建议是使用twisted,因为它有很多websocket库。如果你真的需要使用django ..你可以让django行为通过,对于你使用twisted构建的所有api东西。