保持连接打开,直到发生事件。
答案 0 :(得分:16)
查看Django / Comet (Push): Least of all evils?或The latest recommendation for Comet in Python? - COMET是“ajax long-polling”的另一个名称。
显然,最常见的方法不是直接在django中进行,而是在另外一个守护进程的帮助下(可能是因为例如Apache不能很好地处理大量长期连接)。现在nodejs + socketio非常受欢迎(它甚至可以使用WebSockets) - 你只需要找到一种很好的方法来在两者之间传递数据。如果它是单向的(例如,只是广播到所有连接的客户端),redis pubsub队列对此不是一个糟糕的选择。
但http://code.google.com/p/django-orbited/可能是最好的解决方案。
答案 1 :(得分:9)
对于未来的读者:)
我使用Gevent创建了一个简单的长轮询django类视图,你可以在https://github.com/tbarbugli/django_longpolling的github上找到它或者从pypi(django_longpolling)获取它
编辑:我使用django long polling / async worker做了一些进一步的实验/部署,我可以说如果可能选择外部守护进程是非常的好选择,特别是如果你使用db (当使用异步工作器时,您需要一个数据库连接池,否则您将需要绑定到数据库连接限制的工作连接数量,这是不可取的)。答案 2 :(得分: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:"baurin",
comment : 'comentario de prueba'
};
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>