Puis-je utiliser Socket.IO avec Django? [fermé]

y a-t-il un moyen d'utiliser Socket.IO http://socket.io/ avec Django?

45
demandé sur User 2010-11-16 03:27:32

6 réponses

bien Sûr, vous pouvez!

Django lui-même ne sont pas asyncrones donc vous devez utiliser une prise.Serveur IO en parallèle avec votre serveur django normal, noeud.js n'est pas toujours un bon choix, mais il existe d'autres écrits en pur python.

voici un blog / tutoriel qui utilise gevent comme socket.serveur 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 peut regarder Orbited, (www.orbited.org)

20
répondu 23Critters 2011-02-15 14:55:57

je demande si une implémentation django Côté Serveur existe pour le noeud.js à django.

Non. nœud.js est sa propre langue exécute dans son propre interprète. Cependant si vous demandez s'il y a une application Django qui permet de communiquer avec une Socket.Client IO, alors oui et non. Non, parce qu'il n'existe pas de solution préétablie à l'heure actuelle, et oui, parce que toutes les pièces nécessaires à sa mise en œuvre existent déjà.

Pour mettre en œuvre le protocole avec django, découvrez Django-Websocket pour le serveur websocket backend, les bibliothèques Ajax de Projet Dajax et Socket.Io-rack qui est un joyau de rubis qui met en œuvre le protocole et ruby est assez proche dans la structure de django que vous pouvez obtenir beaucoup d'inspiration de lui.

5
répondu Thomas 2013-04-19 21:18:10

Commencez ici:

et ici:

il y a quelques exemples de Django pour commencer.

il est basé sur Gevent, qui implémente un modèle coopératif de concurrence. C'est génial venant d'un monde de requête/réponse, car il ajoute quelques callbacks et micro-threads sans l'imposant massivement sur votre flux de travail.

l'Essayer :)

2
répondu abourget 2012-05-07 21:12:55

je pense que la meilleure façon d'établir une communication asynchrone avec Django est d'avoir un serveur de noeud qui écoute dans un autre port et d'utiliser le client api de Socket.io. De cette façon, vous n'êtes pas dépendant du support des modules pour django et est très simple: noeud écoutant la demande du client, convertir cette demande dans une demande de poste et envoyer à Django pour le port qui écoutent Django. Est la meilleure façon que j'ai penser.

le serveur.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
répondu Baurin Leza 2016-06-19 14:06:48

pour un exemple d'utilisation de socket.io avec django, vous devriez regarder django-serverpush. Il intègre django avec socket.io comme le transport et tornado / tornandio2 comme le serveur async au lieu de noeud.js

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

autres ont utilisé django avec node.js + socket.io avec rabbitMQ comme pont de la file d'attente des messages entre les deux. Il y a eu une conférence, "Django en temps réel" à djangocon 2011 qui a décrit approche pour les demandes de grande envergure en temps réel (de type bourse-spectacle).

1
répondu user1228770 2012-02-23 15:53:57

les gars, il n'y a pas de support solide pour le socket.io avec django... Il ya comment jamais facile toy programme de soutien socket g-event.le soutien des OI a également été abandonné pour la dernière année, django-socket.io est également abandonné. Si vous voulez construire un programme de jouet simple en utilisant django-socket.IO et / ou g-eVent socket.bien sûr, mais tout ce qui se balance est peu probable "https://github.com/ryesoft/gevent-socketio " this is experimental.

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

le travail autour est ce commit. https://github.com/getpenelope/gevent-socketio/commit/6c80c17705c9a1b3adcb0f99abde1c4d369c337b

j'ai pensé qu'il le jetterait là juste au cas où quelqu'un essayait de l'utiliser dans un environnement de production comme moi.

0
répondu George Host 2014-03-24 07:30:37