Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为HTML5 Django web应用程序实现实时通知系统_Javascript_Django_Html_Angularjs_Notifications - Fatal编程技术网

Javascript 为HTML5 Django web应用程序实现实时通知系统

Javascript 为HTML5 Django web应用程序实现实时通知系统,javascript,django,html,angularjs,notifications,Javascript,Django,Html,Angularjs,Notifications,我目前正在开发一个由Django/apache提供服务的HTML5Web应用程序 该应用程序的目标是监控几个设备:所有客户端逻辑都是用Angular编写的,所有数据都来自对后端进行的基于JSON的REST类调用(我认为这是非常常见的) 到目前为止,这是相当有效的。现在我想实现一个通知系统:它可以对外部事件做出反应,并通知所有正在运行的web应用程序实例页面上需要刷新某些内容。我真的不希望所有实例都只轮询服务器,因为这似乎是次优的。尤其是在移动设备上,这样可能会很快耗尽电池电量 我对这类东西几乎没

我目前正在开发一个由Django/apache提供服务的HTML5Web应用程序

该应用程序的目标是监控几个设备:所有客户端逻辑都是用Angular编写的,所有数据都来自对后端进行的基于JSON的REST类调用(我认为这是非常常见的)

到目前为止,这是相当有效的。现在我想实现一个通知系统:它可以对外部事件做出反应,并通知所有正在运行的web应用程序实例页面上需要刷新某些内容。我真的不希望所有实例都只轮询服务器,因为这似乎是次优的。尤其是在移动设备上,这样可能会很快耗尽电池电量

我对这类东西几乎没有经验(我更像是一个后端开发人员,所以这对我来说都是全新的)。我首先考虑从Javascript端向服务器发出一个长寿命的HTTP请求:该请求只会在超时时间(在这种情况下,客户端必须立即重试并再次等待)后或在某些更改后(然后它会回复一些需要刷新的模型的信息)给出结果

这在理论上似乎是可行的,但我想我还是先问一下,因为这似乎很常见,如果没有这种任务的框架,我会感到惊讶

所以我的问题是:在这种情况下,是否有一个事实上的标准/技术可以使用,和/或您会建议如何实施它?
服务器运行在一个虚拟机上,我对该虚拟机拥有完全控制权:这意味着我可以安装实现该功能所需的任何软件。我希望尽可能避免使用多个网络端口,但如果这能让事情变得更简单,那也没关系。

实时更新可以通过(至少)两种方法完成:(1)连续轮询,(2)Websocket协议

我个人最喜欢的是Websocket协议(但较旧的浏览器不支持它,所以可能是这样,您需要在连续或长时间轮询时进行回退)。Django(1.9)目前不支持WebSocket协议。因此,您的Django项目将需要一个可以帮助实现Websocket协议的助手。常见的选择是和节点。我在下面展示龙卷风的例子:

创建一个辅助tornado项目(您可能必须将其托管在生产环境中的另一台服务器上)。在那里您可以有一个
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的等价物):

现在在Django项目中,您也将建立到这个WebSocketHandler的连接。但在那个里,你们将向Tornado项目发送更新,然后Tornado项目将向HTML5应用程序发送更新

首先,您必须在django中安装软件包。然后您将执行以下操作:

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'}))

看看WebSocket,它们可以用于实时事件,而无需使用轮询。至于框架,我还没有看到任何与django集成的好框架。JS开发人员现在似乎只关心NodeJ。
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'}))