我目前正在研究由Django / apache提供的HTML5网络应用程序。
该应用程序的目标是监视几个设备:所有客户端逻辑都是使用Angular编写的,所有数据都来自对后端进行的基于JSON的类似REST的调用(我假设这是非常常见的事情)。 / p>
到目前为止,这种方法运作良好。现在我想实现一个通知系统:会对外部事件作出反应并会通知所有正在运行的Web应用程序实例,这些内容需要在页面上刷新。我真的不希望所有实例只是轮询服务器,因为这似乎是次优的。特别是在可能会快速耗尽电池的移动设备上。
我对这种东西的经验很少(我更像是一个后端开发人员,所以这对我来说都是新手)。我首先考虑从Javascript端向服务器发出长期的HTTP请求:此请求只会在超时期限之后给出结果(在这种情况下客户端必须重试并立即再次等待)或者在某些内容发生变化之后(然后会回复一些有关需要刷新的模型的信息)。
这看起来似乎可以在理论上起作用,但我想我首先要问的是因为它看起来很常见,如果没有这种任务的框架,我会感到惊讶。
服务器正在VM中运行,我有一个总控制:这意味着我可以安装我需要的任何软件来实现它。我想避免尽可能多地使用多个网络端口,但如果它让事情变得更容易,那就没关系了。
答案 0 :(得分:3)
实时更新可以在(至少)两种方法中完成:(1)连续轮询,(2)Websocket协议
我个人最喜欢的是Websocket协议(但是老版本的浏览器不支持它,所以可能是,您需要在连续或长时间轮询中进行回退)。 Django(1.9)目前不支持WebSocket协议。所以你的Django项目需要一个可以帮助实现Websocket协议的sidekick。常见的选择是Tornado和NodeJS。我正在展示下面的龙卷风示例:
创建辅助龙卷风项目(您可能必须在生产环境中的其他服务器上托管它)。在那里,您可以拥有WebSocketHandler
,如下所示:
import tornado.websocket
# suppose URL for this handler is localhost:8888/my_handler/
class MyWebSocketHandler(tornado.websocket.WebSocketHandler):
waiters = set()
def open(self):
MyWebSocketHandler.waiters.add(self)
def on_close(self):
MyWebSocketHandler.waiters.remove(self)
def on_message(self, message):
MyWebSocketHandler.send_updates(message)
@classmethod
def send_updates(cls, stuff_django_project_sends):
for waiter in cls.waiters:
waiter.write_message(stuff_django_project_sends)
在您的HTML5应用中,您将拥有类似的内容(这是简单的JavaScript,我不知道它与AngularJS相当):
var url = "ws://localhost:8888/my_handler/";
socket = new WebSocket(url); // establish connection with WebSocketHandler to listen to updates
socket.onmessage = function(event) {
var stuff_django_project_sent = JSON.parse(event.data));
// do something with this stuff now
}
现在,在您的Django项目中,您将建立与此WebSocketHandler的连接。但在那里,您将向Tornado项目发送更新,然后将更新发送到HTML5应用程序。
首先,您必须在django中安装websocket-client包。然后你会做类似的事情:
from websocket import create_connection
import json
url = "ws://localhost:8888/my_handler/"
web_socket = create_connection(url)
web_socket.send(json.dumps({'stuff': 'to send'}))