web-dev-qa-db-fra.com

Puis-je utiliser Socket.IO avec Django?

Est-il possible d'utiliser Socket.IO http://socket.io/ avec Django?

46
User

Sûr que vous pouvez!

Django lui-même n'est pas asynchrone, vous devez donc utiliser un serveur Socket.IO en parallèle avec votre serveur Django normal. Node.js n'est pas toujours un bon choix mais il en existe d'autres écrits en python pur.

voici un blog/tutoriel qui utilise gevent comme serveur socket.io.

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

Pour une solution similaire qui a un peu plus d’histoire, vous pouvez consulter Orbited (www.orbited.org)

21
23Critters

Je demande si une implémentation Django côté serveur existe pour node.js dans Django.

Node.js est son propre langage qui s'exécute dans son propre interpréteur. Cependant, si vous demandez s'il existe une application Django permettant de communiquer avec un client Socket.IO, alors oui et non. Non, car il n'existe actuellement aucune solution préconfigurée, et oui, toutes les pièces nécessaires à son implémentation existent déjà.

Pour implémenter le protocole avec Django, consultez Django-Websocket pour le serveur Websocket backend, les bibliothèques Ajax de Dajax Project et Socket.IO-rack qui est une gemme Ruby qui implémente le protocole. et Ruby est assez proche de Django pour que vous puissiez vous en inspirer.

5
Thomas

Commencer ici:

et ici:

Il y a quelques exemples Django sur la façon de commencer.

Il est basé sur Gevent, qui implémente un modèle de concurrence simultané. C'est génial de venir d'un monde de demandes/réponses, car cela ajoute des rappels et des micro-threads sans l'imposer de manière massive à votre flux de travail.

Essaye le :)

2
abourget

Je pense que le meilleur moyen de communiquer de manière asynchrone avec Django est d’avoir un serveur de nœud en écoute sur un autre port et d’utiliser le client api de Socket.io. De cette façon, vous ne dépendez pas de la prise en charge des modules pour Django et est très simple: Node écoutant la demande du client, convertit cette demande en une demande de publication et envoie à Django pour le port qui écoute Django. Est la meilleure façon je pense.

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

Pour un exemple d'utilisation de socket.io avec Django, vous pouvez regarder Django-serverpush. Il intègre Django avec socket.io en tant que transport et tornado/tornandio2 en tant que serveur async au lieu de node.js 

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

D'autres ont utilisé Django avec node.js + socket.io avec rabbitMQ comme pont de file d'attente des messages entre les deux. Lors de la conférence "Django en temps réel" au cours d'une conférence de presse en 2011, il a décrit l'utilisation de cette approche pour les applications en temps réel de grande taille (type émission de prix).

1
user1228770

Les gars, il n'y a pas de support solide pour socket.io avec Django ... il est difficile de prendre en charge le programme toy-toy socket.io depuis un an. Django-socket.io est également abandonné .Si vous voulez construire un simple programme jouet en utilisant Django-socket.io et/ou g-event socket.io, mais tout ce qui évolue est peu probable " https://github.com/ryesoft/gevent-socketio "c'est expérimental.

Problèmes avec plus d'un travailleur avec gunicorn .... https://github.com/abourget/gevent-socketio/issues/112

La solution de rechange consiste à ce commit . https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

Je pensais que cela serait jeté au cas où quelqu'un essaierait de l'utiliser dans un environnement de production tel que moi-même.

0
George Host