web-dev-qa-db-de.com

Kann ich Socket.IO mit Django verwenden?

Gibt es eine Möglichkeit, Socket.IO http://socket.io/ mit Django zu verwenden?

46
User

Sicher kannst du!

Da Django selbst nicht asyncron ist, müssen Sie einen Socket.IO-Server parallel zu Ihrem normalen Django-Server verwenden.

hier ist ein Blog/Tutorial, das gevent als socket.io-Server verwendet.

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

Für eine ähnliche Lösung mit etwas mehr Geschichte können Sie sich Orbited anschauen (www.orbited.org).

21
23Critters

Ich frage, ob es eine serverseitige Django-Implementierung für node.js in Django gibt.

Nein. Node.js ist eine eigene Sprache, die in einem eigenen Interpreter ausgeführt wird. Wenn Sie jedoch fragen, ob es eine Django-App gibt, die die Kommunikation mit einem Socket.IO-Client ermöglicht, dann ja und nein. Nein, weil derzeit keine vorgefertigte Lösung vorhanden ist, und ja, weil alle für die Implementierung erforderlichen Teile bereits vorhanden sind.

Um das Protokoll mit Django zu implementieren, check out Django-Websocket für den Backend-Websocket-Server, Ajax-Bibliotheken von Dajax Project und Socket.IO-rack . Dies ist ein Ruby-Gem, der das Protokoll implementiert und Ruby ist Django so nahe, dass man sich davon inspirieren lässt.

5
Thomas

Fang hier an:

und hier:

Es gibt einige Django-Beispiele, um zu beginnen.

Es basiert auf Gevent, das ein kooperatives Parallelitätsmodell implementiert. Es ist großartig, aus einer Request/Response-Welt zu kommen, da es einige Rückrufe und Mikrothreads hinzufügt, ohne dass dies massiv in Ihren Workflow einfließt.

Versuch es :)

2
abourget

Ich denke, der beste Weg zur asynchronen Kommunikation mit Django ist, dass ein Knotenserver an einem anderen Port abgehört wird und der API-Client von Socket.io verwendet wird. Auf diese Weise sind Sie nicht von der Unterstützung der Module für Django abhängig und es ist sehr einfach: Der Knoten hört die Anfrage des Clients ab, konvertiert diese Anfrage in einer Post-Anfrage und sendet sie an Django für den Port, der Django hört. Ich denke am besten.

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> 
2
Baurin Leza

Ein Beispiel für die Verwendung von socket.io mit Django finden Sie unter Django-serverpush. Es integriert Django mit socket.io als Transport und Tornado/Tornandio2 als async-Server anstelle von node.js 

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

Andere haben Django mit node.js + socket.io mit rabbitMQ als Message-Queue-Bridge zwischen den beiden verwendet. Auf der djangocon 2011 gab es einen Vortrag mit dem Titel "Real-Time Django", in dem die Verwendung dieses Ansatzes für große Echtzeitanwendungen (Award-Show-Type) beschrieben wurde.

1
user1228770

Jungs, es gibt keine solide Unterstützung für socket.io mit Django ... es gibt auch die einfache Unterstützung für Spielzeugprogramme g-event socket.io wurde für das letzte Jahr eingestellt, Django-socket.io wird auch aufgegeben .Wenn Sie ein einfaches Spielzeugprogramm mit Django-socket.io und oder g-event socket.io erstellen möchten, aber alles, was skaliert, ist unwahrscheinlich " https://github.com/ryesoft/gevent-socketio "das ist experimentell.

Probleme mit mehr als einem Arbeiter bei gunicorn .... https://github.com/abourget/gevent-socketio/issues/112

Die Problemumgehung ist dieses Commit . https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

Ich dachte, es würde es rauswerfen, nur wenn jemand versuchte, dies in einer Produktionsumgebung wie mir selbst zu verwenden.

0
George Host