Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Django服务器推送方法_Django_Tornado_Server Push - Fatal编程技术网

Django服务器推送方法

Django服务器推送方法,django,tornado,server-push,Django,Tornado,Server Push,我开发了一个Django应用程序,它需要服务器推送(或comet)来进一步增强。我首先使用“orbited”成功地实现了服务器推送,它在除IE之外的所有主流浏览器中都非常有效(是的,我知道……这个IE又一次毁了我的生活)。虽然IE的重要性已经大大降低,但我仍然希望实现在所有主要平台上都能工作的服务器推送 我已经在谷歌上搜索了几天,这里是我找到的一些选择 使用evserver() 使用Django+Tornado框架 从长远来看,使用Django+Tornado平台似乎更为理想,但我找不到一个好的

我开发了一个Django应用程序,它需要服务器推送(或comet)来进一步增强。我首先使用“orbited”成功地实现了服务器推送,它在除IE之外的所有主流浏览器中都非常有效(是的,我知道……这个IE又一次毁了我的生活)。虽然IE的重要性已经大大降低,但我仍然希望实现在所有主要平台上都能工作的服务器推送

我已经在谷歌上搜索了几天,这里是我找到的一些选择

  • 使用evserver()
  • 使用Django+Tornado框架
  • 从长远来看,使用Django+Tornado平台似乎更为理想,但我找不到一个好的例子来学习如何结合两个框架实现服务器推送。我发现的唯一例子是

    django龙卷风演示()

    但是,我不确定这个项目是否处理了服务器推送机制,缺少一些解释

    有谁能告诉我一个演示项目的好例子,它将Django和Tornado结合在一起并实际实现了服务器推送机制?此外,我们将非常感谢您提供有关此主题的任何信息

    提前非常感谢。

    SockJS是一个不错的选择:

    首先,准备好您的环境:

    pip install sockjs-tornado
    
    其次,您必须设置Tornado:

    application = django.core.handlers.wsgi.WSGIHandler()
    container = tornado.wsgi.WSGIContainer(application)
    
    
    tornado_app = tornado.web.Application(
        EchoSockjsRouter('/websocket')+
        [
            ('/source/([^/]+)', SourceHandler),
            ('.*', tornado.web.FallbackHandler, dict(fallback=container)),
        ]
    )
    
    HTTPServer(tornado_app).listen(port)
    tornado.ioloop.IOLoop.instance().start()
    
    “/source”是一个请求处理程序(我使用它与@gen.engine进行异步),“.*”适用于Django,EchoSockjsRouter就是您想要的:

    from sockjs.tornado import SockJSRouter, SockJSConnection
    
    class EchoWebSocket(SockJSConnection):
      def on_open(self, request):
          print "sockjs: open"
    
      def on_message(self, data):
          print "data: %r" % (data,)
          self.send(data)
    
      def on_comment(self, data):
          print "data: %r" % (data,)
          self.send(data)
    
      def on_close(self):
          print "sockjs: close"
    
    def EchoSockjsRouter(prefix):
        return SockJSRouter(EchoWebSocket, prefix).urls
    
    之后,您需要设置UI(我使用的是SockJS客户端,版本0.3.4,MIT许可证):

    
    socket=newsockjs('http://localhost:8000/websocket');
    socket.onmessage=函数(e){
    控制台日志(如数据);
    };
    socket.onclose=函数(){
    console.log('closed:(');
    };
    socket.onopen=函数(){
    console.log('opened:>');
    让妈妈开始吧();
    };
    函数letTheMadnessBegin(){
    //傻,但你明白了
    send(JSON.stringify({
    名称:$(“#名称”).text(),
    消息:$('input').val()
    }));
    }
    
    好的,您可以在$(function(){})中使脚本变得非常漂亮…但是除此之外,您已经准备好了:,(对于404,很抱歉,这是为了使它成为现实的O.O。)我从以下模式中获取此模式:

    请注意我试过Socketio、Tornado WebSocket和其他一些工具。但是SocketJS非常直截了当


    注意。

    还有,您可以将它与Django一起使用。(API方面与SockJS示例非常相似,可能会有所帮助)

    非常感谢Ericson。你的回答和所有的参考资料帮助我朝着正确的方向前进。我还没有机会在我的应用程序中真正实现这一点,但我现在更清楚地知道该怎么做。再次感谢你。我终于在Django应用程序中实现了SockJS,我只想为任何人提供后续信息未来可能会访问此页面,寻求服务器推送的帮助。SockJS非常直截了当,易于实现,在我测试过的所有主要浏览器中都像一个魅力。正如Ericson指出的,SockJS是一条出路!我正在寻找在本例中服务器向所有客户端发送消息的地方(即,启动服务器推送)。它在某个地方吗?我看到了客户端的消息被重新广播到其他连接的客户端的位置,但不是服务器启动的消息。如果我没有错,@npskirk,您需要的是通道。您可以创建一个通道,并使用它为订阅者发送消息。感谢Bernhard提供的参考。我还将查看Socket.IO。
    <script src="<SockJS Javascript>"></script>
    <script>
        socket = new SockJS('http://localhost:8000/websocket');
        socket.onmessage = function(e) {
            console.log(e.data);
        };
        socket.onclose = function() {
            console.log('closed :(');
        };
        socket.onopen = function() {
            console.log('opened :>');
            letTheMadnessBegin();
        };
    
        function letTheMadnessBegin() {
            // silly, but you get the idea
            socket.send(JSON.stringify({
                name: $('#name').text(),
                message: $('input').val()
            }));
        }
    <script>