2011-01-24 85 views
15

イベントが発生するまで、接続を開いたままにしておきます。DjangoにはHTTPの長時間のポーリング接続を開く方法がありますか?

+0

世論調査?それが素晴らしいとはいえ、長いポール接続がどんなものかは分かりません。 ;) –

+0

それはどんなイベントですか? Djangoは、リクエストと応答を扱う* web *フレームワークであり、シグナルプロトコルではありません。あなたの質問を誤解して申し訳ありません。 – AndiDog

+0

ロングポーリングは、AJAXアプリケーションで使用されるメソッドで、サーバー上のイベントが発生するとすぐに何かを行う必要があります。だから、基本的には即座に処理されるのではなく、特定のイベントが発生するとすぐにAJAXリクエストを開始します。応答を受け取った後、要求は通常すぐに再開されます。 @ThiefMaster。 – ThiefMaster

答えて

14

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の解決策です。将来の読者:)

については

+0

オービットはいいです。次のベストなことは[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/)では、より多くのことを説明し、使用できるコードをいくつか提供しています。 –

+0

pythonでsocket.ioを実装する場合:https://gevent-socketio.readthedocs.org/en/latest/ – turtlemonvh

9

私はGeventを使用して、単純なロングポーリングDjangoのクラスビューを作成し、あなたはhttps://github.com/tbarbugli/django_longpollingにgithubの上でそれを見つけるかは、PyPI(django_longpolling)

EDITからそれを得ることができます:私はやりました私はdjangoの長いポーリング/非同期作業者とのさらなる実験/デプロイメントを可能にしたら、非常にという良い選択肢があると言います。特にdbを使用する場合(非同期ワーカーを使用する場合はdb接続プールが必要です。 db接続制限に縛られている作業者接続の量が必要になります)。

2

私は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> 
関連する問題