4

我开发了一个 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 结合在一起并实际实现服务器推送机制的演示项目的好例子?此外,任何有关此主题的信息都将受到高度赞赏。

非常感谢您提前。

4

2 回答 2

6

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

首先,准备好你的环境:

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,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>

好吧,你可以在 $(function(){}) 中制作漂亮的脚本......但除此之外,你已经准备好去:http ://grab.by/mSv6,http : //grab.by/mSuU(对不起404,这是为了让它变得现实Oo)。我从:https ://idea.popcount.org/2012-09-21-django-with-sockjs/

请注意,我尝试过使用SocketioTornado WebSocket和其他一些。然而 SocketJS 非常简单。

问候。

于 2013-05-25T06:33:04.673 回答
1

还有Socket.IO,您可以将它与gevent-socketio / django-socketio和 Django 一起使用。(API 方面与 SockJS 示例非常相似,也许https://stackoverflow.com/a/11874593/183910有帮助)

于 2013-05-25T11:28:26.823 回答