有没有办法在Django上使用Socket.IO http://socket.io/?
答案 0 :(得分:21)
当然可以!
Django本身不是异步的,所以你必须与你的普通django服务器并行使用Socket.IO服务器,node.js总是一个不错的选择,但还有其他用纯python编写的。
这是一个使用gevent作为socket.io服务器的博客/教程。
http://codysoyland.com/2011/feb/6/evented-django-part-one-socketio-and-gevent/
对于有更多历史的类似解决方案,您可以查看Orbited,(www.orbited.org)
答案 1 :(得分:5)
我在问django中是否存在node.js的服务器端django实现。
没有。 node.js是在自己的解释器中运行的自己的语言。但是,如果您询问是否有允许与Socket.IO客户端通信的Django应用程序,那么是和否。不,因为当前没有预先制定的解决方案,是的,因为您需要实现它的所有部分已经存在。
要使用django实现协议,请查看Django-Websocket后端websocket服务器,来自Dajax Project和Socket.IO-rack的Ajax库,它是实现协议的ruby gem,而ruby是关闭的结构足够django,你可以从中获得很多灵感。
答案 2 :(得分:2)
从这里开始:
在这里:
有一些关于如何开始的Django示例。
它基于Gevent,它实现了一种协作并发模型。来自请求/响应世界的很棒,因为它添加了一些回调和微线程,而没有在工作流程中大量使用它。
尝试一下:)
答案 3 :(得分:2)
我认为与Django进行异步通信的最佳方法是让节点服务器在另一个端口侦听并使用Socket.io的api客户端。通过这种方式,您不依赖于模块对django的支持,并且非常简单:节点侦听来自客户端的请求,在post请求中转换此请求并发送到Django以获取侦听Django的端口。 这是我认为最好的方式。
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();
});
});
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)
<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>
答案 4 :(得分:1)
有关使用带有django的socket.io的示例,您可能需要查看django-serverpush。它集成了django和socket.io作为传输,tornado / tornandio2作为异步服务器而不是node.js
https://github.com/hamax/django-serverpush
其他已经使用django和node.js + socket.io一起使用rabbitMQ作为两者之间的消息队列桥。 2011年djangocon上有一个名为“Real-Time Django”的演讲,描述了这种用于大型实时(奖项显示型)应用的方法。
答案 5 :(得分:0)
家伙没有对django的socket.io的坚定支持...有一个简单的玩具程序支持g-event socket.io支持在去年也被删除了,django-socket.io也被放弃了。 如果你想使用django-socket.io和/或g-event socket.io来构建一个简单的玩具程序,但任何扩展的东西都不太可能“https://github.com/ryesoft/gevent-socketio”这是实验性的。
超过1名带枪炮的工人的问题...... https://github.com/abourget/gevent-socketio/issues/112
解决方法就是提交。 https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b
我认为只要有人试图在像我这样的生产环境中使用它,它就会抛弃它。