实时更新可以采用(至少)两种方法:(1)持续轮询,(2)Websocket协议
我个人最喜欢的是Websocket协议(但旧版浏览器不支持它,因此可能需要在持续或长轮询上进行回退)。截至目前为止,Django(1.9)不支持WebSocket协议。因此,您的Django项目将需要一个能够帮助实现WebSocket协议的副手。常见选择是Tornado和NodeJS。下面是Tornado示例:
创建一个辅助tornado项目(在生产环境中可能需要将其托管在不同的服务器上)。在那里,你可以拥有一个如下所示的WebSocketHandler
:
import tornado.websocket
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项目发送更新,然后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'}))