我需要在django中构建一个推送系统,基本上它的功能是将消息从服务器推送到浏览器。
由于不能使用 nodejs,我更喜欢 websocket 或轨道,但我不知道如何在 django 中实现这两者。请为我推荐一种方法,这对我有很大帮助,谢谢。
一种选择是使用与具有 REST/Push API 的 Django 服务器并行运行的 WebSocket 服务器,然后通过简单的 HTTP/POST 从 Django 推送到 WebSocket 服务器,然后将消息传递给所有连接的 WebSocket 客户端.
这样,您不需要对现有 Django 应用程序进行任何结构/技术更改,但仍具有可扩展的、基于现代 WebSocket 的推送功能。
对于上面提供的托管服务,我会看看http://pusher.com。
如果您更喜欢自己运行,我会查看http://autobahn.ws,它被部署为可立即运行的虚拟设备(VMware、VirtualBox、Amazon EC2)。你可以在这里找到 REST/API 的工作示例https://github.com/tavendo/AutobahnPushPython
免责声明:我是 Autobahn Open-source 的作者,并为提供 Autobahn.ws(基于 Autobahn OSS 的商业产品)的 Tavendo 工作。
Django 不擅长向客户端“推送”东西。如果 django 是您唯一的选择,那么模拟推送的唯一方法是通过长轮询。但这不是有效的。相反,websockets 很热。龙卷风和扭曲可以在这里为您提供帮助。您的问题在这里也有更完整的答案。
Django 中 websocket 的另一种实现: https ://github.com/jonasagstedt/swampdragon
来自文档:SwampDragon 使用了 Django 出色的 ORM、Tornados 出色的 websocket 支持(带有后备。在 IE7 中测试)和 Redis 极快的速度。
截至 2016 年,有Django Channels,它将 websockets 引入 Django(1.8 及更高版本)。
它也是官方 Django 项目的一部分。
有一个 Django 模块,它支持开箱即用的 websockets,使用 Redis 作为消息队列。看看这里:https ://github.com/jrief/django-websocket-redis
免责声明:我是该库的作者。
正如@hymloth 所建议的,更好的方法是使用 tornado 或 node.js。
但是,如果您必须使用 Django,我已经写了一篇关于用它实现 WebSocket 的文章,您可能会发现它很有用。
http://curella.org/blog/2012/jul/17/django-push-using-server-sent-events-and-websocket/
在内部使用 tornado 并支持 python 3。