Django服务器推送方法

Chr*_*s P 4 django tornado server-push

我开发了一个Django应用程序,它需要服务器推送(或彗星)以进一步增强.我首先使用"orbited"成功实现了服务器推送,除了IE之外,它在所有主流浏览器中都运行良好(是的,我知道......这个IE再一次让我的生活变得糟透了).尽管IE的重要性已大大降低,但我仍然希望实现可在所有主要平台上运行的服务器推送.

我已经谷歌搜索了几天,这里有一些我找到的选项.

  1. 使用evserver(https://code.google.com/p/evserver/)
  2. 使用Django + Tornado框架

从长远来看,似乎使用Django + Tornado平台更为理想,但我无法找到一个很好的例子,我可以从中学习如何实现结合两个框架的服务器推送.我发现的唯一例子是

django-tornado-demo(https://github.com/bdarnell/django-tornado-demo/tree/master/testsite)

但是,我不确定这个项目是否处理服务器推送机制或其他方式,缺乏一些解释.

任何人都可以指导我将Django和Tornado结合在一起并实际实现服务器推送机制的演示项目的一个很好的例子吗?此外,我们将非常感谢有关此主题的任何信息.

非常感谢你提前.

eri*_*eda 6

SockJS是要走的路:https://github.com/mrjoes/sockjs-tornado

首先,让您的环境做好准备:

pip install sockjs-tornado
Run Code Online (Sandbox Code Playgroud)

其次,你必须设置龙卷风:

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()
Run Code Online (Sandbox Code Playgroud)

'/ source'是一个Request处理程序(我使用它与@ 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
Run Code Online (Sandbox Code Playgroud)

之后,您将需要设置UI(我使用的是SockJS客户端,版本0.3.4,http://sockjs.org,MIT 许可证):

<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>
Run Code Online (Sandbox Code Playgroud)

好吧,你可以把脚本放在$(function(){})里面...但除此之外,你准备好了:http://grab.by/mSv6,http://grab.by/mSuU(抱歉404,它是现实的Oo).我采用了以下模式:https://idea.popcount.org/2012-09-21-django-with-sockjs/

请注意,我尝试使用Socketio,Tornado WebSocket和其他一些.然而,SocketJS非常直截了当.

问候.