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