イベントが発生するまで、接続を開いたままにしておきます。DjangoにはHTTPの長時間のポーリング接続を開く方法がありますか?
答えて
Django/Comet (Push): Least of all evils?またはThe latest recommendation for Comet in Python?をご覧ください。COMETは、「ajax long-polling」の別の名前です。
最も一般的なアプローチは、djangoではなく、追加のデーモンを使用して直接行うことです(おそらく、例えばApacheは長寿命の接続ではうまくいかないためです)。現在、nodejs + socketioはこれに非常によく使われています(WebSocketを使用することもできます)。この2つの間でデータをやりとりするうまい方法を見つける必要があります。単方向性の場合(たとえば、接続されているすべてのクライアントにブロードキャストするだけの場合)、redis pubsubキューはこれに対して悪いオプションではありません。
しかし、http://code.google.com/p/django-orbited/は、おそらく最もdjangoishの解決策です。将来の読者:)
については
オービットはいいです。次のベストなことは[Server Sent Events](http://en.wikipedia.org/wiki/Server-sent_events)です。この[post on html5rocks.com](http://www.igvita.com/2011/08/26/server-sent-event-notifications-with-html5/)では、より多くのことを説明し、使用できるコードをいくつか提供しています。 –
pythonでsocket.ioを実装する場合:https://gevent-socketio.readthedocs.org/en/latest/ – turtlemonvh
私はGeventを使用して、単純なロングポーリングDjangoのクラスビューを作成し、あなたはhttps://github.com/tbarbugli/django_longpollingにgithubの上でそれを見つけるかは、PyPI(django_longpolling)
EDITからそれを得ることができます:私はやりました私はdjangoの長いポーリング/非同期作業者とのさらなる実験/デプロイメントを可能にしたら、非常にという良い選択肢があると言います。特にdbを使用する場合(非同期ワーカーを使用する場合はdb接続プールが必要です。 db接続制限に縛られている作業者接続の量が必要になります)。
私はDjangoとの非同期通信の最善の方法は、別のポートでリッスンしているノードサーバーがあり、Socket.ioのapiクライアントを使用することだと思います。この方法で、あなたはdjangoのモジュールのサポートに依存せず、非常に単純です:ノードはクライアントからのリクエストを聞き、ポストリクエストでこのリクエストを変換し、Djangoをlistenするポートのために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:"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>
世論調査?それが素晴らしいとはいえ、長いポール接続がどんなものかは分かりません。 ;) –
それはどんなイベントですか? Djangoは、リクエストと応答を扱う* web *フレームワークであり、シグナルプロトコルではありません。あなたの質問を誤解して申し訳ありません。 – AndiDog
ロングポーリングは、AJAXアプリケーションで使用されるメソッドで、サーバー上のイベントが発生するとすぐに何かを行う必要があります。だから、基本的には即座に処理されるのではなく、特定のイベントが発生するとすぐにAJAXリクエストを開始します。応答を受け取った後、要求は通常すぐに再開されます。 @ThiefMaster。 – ThiefMaster