web-dev-qa-db-ja.com

DjangoでSocket.IOを使用できますか?

DjangoでSocket.IO http://socket.io/ を使用する方法はありますか?

48
User

もちろんできます!

Django自体は非同期であるため、Socket.IOサーバーを通常のDjangoサーバーと並行して使用する必要があります。node.jsは常に良い選択ではありませんが、純粋なPythonで記述されたものがあります。

これは、geventをsocket.ioサーバーとして使用するブログ/チュートリアルです。

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

もう少し歴史のある同様のソリューションについては、Orbited(www.orbited.org)をご覧ください。

22
23Critters

私は、サーバー側Django= Djangoのnode.jsの実装が存在するかどうかを尋ねています。

いいえ。node.jsは、独自のインタープリターで実行される独自の言語です。ただし、Socket.IOクライアントとの通信を許可するDjangoアプリがあるかどうかを尋ねる場合は、yesとnoを選択します。それを実装するために必要な部分はすでに存在します。

Djangoでプロトコルを実装するには、バックエンドWebsocketサーバーの Django-WebsocketDajax Project および Socket.IO-rack のAjaxライブラリをチェックしてください。これはRubyプロトコルを実装するgemであり、Rubyは構造的にDjangoそれから多くのインスピレーション。

5
Thomas

Djangoとの非同期通信の最良の方法は、ノードサーバーが別のポートでリッスンし、Socket.ioのapiクライアントを使用することだと思います。この方法では、サポートに依存しませんDjangoのモジュールの非常に簡単です:Nodeクライアントからのリクエストをリッスンし、このリクエストを投稿リクエストで変換し、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> 
3
Baurin Leza

ここで始める:

そしてここ:

始める方法については、Djangoの例があります。

これは、協調的並行性モデルを実装するGeventに基づいています。リクエスト/レスポンスの世界から来るのは素晴らしいことです。ワークフローに大量の負荷をかけることなく、コールバックとマイクロスレッドを追加するからです。

やってみよう :)

2
abourget

Djangoでsocket.ioを使用する例については、Django-serverpushをご覧ください。トランスポートとしてsocket.io、node.jsの代わりに非同期サーバーとしてtornado/tornandio2を使用して、Djangoと統合します。

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

他はDjango with node.js + socket.io with rabbitMQを2つの間のメッセージキューブリッジとして使用しました。大規模なリアルタイム(アワードショータイプ)アプリケーションのアプローチ。

1
user1228770

Djangoでsocket.ioをしっかりサポートしているわけではありません...昨年もg-event socket.ioのサポートが簡単に廃止され、Django-socket.ioも廃止されました。 Django-socket.ioまたはg-event socket.ioを使用して簡単なおもちゃのプログラムを構築したいが、スケーリングするものがありそうにない場合は、「 https://github.com/ryesoft/gevent-socketio "これは実験的なものです。

Gunicornでの複数のワーカーの問題.... https://github.com/abourget/gevent-socketio/issues/112

回避策はこのコミットです。 https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

誰かが私のような本番環境でこれを使用しようとしていた場合に、それをそこに放り出すと思った。

0
George Host