我可以在Django中使用Socket.IO吗?

有什么办法可以用Django使用Socket.IO http://socket.io/ ?

你当然可以!

Django本身并不是asynchronous的,所以你必须和普通的django服务器并行使用一个Socket.IO服务器,node.js并不总是一个不错的select,但是还有其他的东西是用纯python编写的。

这里是一个使用gevent作为socket.io服务器的博客/教程。

http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/

对于有更多历史的类似解决scheme,您可以查看Orbited(www.orbited.org)

我问的是django中的node.js是否存在服务器端django实现。

Node.js是它自己的语言,运行在它自己的解释器中。 但是,如果你问是否有一个允许与Socket.IO客户端通信的Django应用程序,那么是和不是。 没有,因为目前没有预先制定的解决scheme,是的,因为你需要实施的所有部分已经存在。

为了用django来实现协议,请查看Django-Websocket作为后端websocket服务器,从Dajax Project 获取 Ajax库和Socket.IO-rack ,这是一个实现协议的ruby gem,ruby在结构上足够接近django,你可以从中得到很多启发。

从这里开始:

和这里:

有一些Django的例子说明如何开始。

它基于Gevent,它实现了协作式并发模型。 来自请求/响应的世界很棒,因为它增加了一些callback和微线程,而不会大量地将其强加在工作stream程上。

试试看 :)

我认为与Django进行asynchronous通信的最佳方式是使用另一个端口侦听节点服务器,并使用Socket.io的api客户端。 这样,你不依赖于Django模块的支持,并且非常简单:节点侦听来自客户端的请求,将该请求转换为发送请求,并且发送给Django用于侦听Django的端口。 是我认为最好的方式。

server.js

var http = require('http'); var server = http.createServer().listen(3000); var io = require('socket.io').listen(server); var querystring = require('querystring'); io.on('connection',function(socket) { console.log('Connected to the client'); socket.on('new comment',function(data) { console.log('Web--->Node'); var values = querystring.stringify(data); console.log(values); var options = { hostname:'localhost', port:'8000', path:'/create-comment', method:'POST', headers:{ 'Content-Type':'application/x-www-form-urlencoded', 'Content-Length':values.length } }; var request = http.request(options, function(response) { response.setEncoding('utf8'); response.on('data',function(data){ //Here return django console.log('Django-->Node'); io.emit('return comment',data); }); }); request.write(values); request.end(); }); }); 

views.py

 def trysock(request): print 'In tryshok' comments = Comment.objects.all() dic = { 'name': 'User', 'form': CommentForm(), 'comments': comments } return render(request,'index.html',dic) @csrf_exempt def create_comment(request): print 'Django<---Node' Comment.objects.create( user = request.POST['user'], comment = request.POST['comment'] ) response = JsonResponse({'user' : request.POST['user'], 'comment' : request.POST['comment']}) print response.content return HttpResponse(response.content) 

的index.html

 <div class='col-md-12'> <div class='col-md-6'> <form method='POST'> {% csrf_token %} {{form.comment}} <button id='boton'>Comentar</button> </form> </div> <div id='comentarios' class='col-md-6'> {% for comment in comments %} <p>{{ comment.user }} - {{ comment.comment}}</p> {% endfor %} </div> </div> <!-- Fin Formulario comentarios --> </div> <script> var socket = io.connect('http://localhost:3000'); console.log(socket); $('#boton').on('click', Comentar); function Comentar(e) { console.log('Comentar(e)') e.preventDefault(); var datos = { user:"user", comment : 'comment' }; socket.emit('nuevo comentario', datos); console.log('Enviando....: ' + datos.user + '-' + datos.comment); } socket.on('devolviendo comentario', function(data) { console.log('Recibiendo...'); var dato = JSON.parse(data); $('#comentarios').prepend('<p>' + dato.user + '-' + dato.comment + '</p>') }); </script> 

有关使用django使用socket.io的示例,您可能需要查看django-serverpush。 它将django与socket.io作为传输,将龙卷风/ tornandio2作为asynchronous服务器而不是node.js

https://github.com/hamax/django-serverpush

其他人使用django和node.js + socket.io,以rabbitMQ作为两者之间的消息队列桥。 在djangocon 2011上有一个演讲“Real-Time Django”,描述了这种方法适用于大型实时(奖励表演)应用程序。

伙计们对于使用django的socket.io没有坚实的支持……玩家程序支持g-event socket.io支持在去年也是如此,django-socket.io也被放弃了。 如果你想用django-socket.io或者g-event socket.io来构build一个简单的玩具程序,但是任何缩放的东西都不太可能“ https://github.com/ryesoft/gevent-socketio ”,这是实验性的。

超过1个工人与gunicorn问题…. https://github.com/abourget/gevent-socketio/issues/112

解决方法是这个提交。 https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

我以为它会把它扔出去,就像有人试图在像我这样的生产环境中使用它一样。