2012-02-28 15 views
13

Mi chiedevo come creare un servizio web django (risponde con XML) con websocket. Ho già un servizio web django che accetta richieste xml, analizza quelle richieste, crea una query sul database, crea una risposta xml e rimanda l'xml al richiedente/browser. Solo una normale richiesta HTTP XML, in cui la risposta viene mostrata come xml all'interno del browser.WebSocket + Django Python WebService

Ma come potrei creare un webservice web django websocket? Diciamo che vorrei inviare una risposta XML al richiedente/browser con gli ultimi dati dal database ogni volta che si verifica un nuovo evento magico.

Ho letto un sacco di post e blog ma era un po 'troppo generale. Posso risolvere questo solo con django + apache o ho bisogno di qualcos'altro accanto a django e un altro server solo per gestire le web socket?

Attualmente sto usando django 1.3, Apache + wsgi ma sarei pronto a cambiare qualsiasi configurazione che funzionerebbe.

Aggiornamento:

Ci sono molti WebSockets possibili là fuori, http://pypi.python.org/pypi?:action=search&term=websocket&submit=search ma quale potrebbe essere utilizzato nel mio caso?

risposta

8

Spiacente, ma django gestisce richieste asincrone molto molto male come è wsgi. Sarai limitato dal numero di istanze parallele se devi gestire gli utenti reali. La soluzione migliore è usare tornado o node.js.

Tornado gestisce brillantemente ragnatela e polling lungo. Ecco il mio wrapper per consentire di ottenere degli utenti e le sessioni da un parallelo filo tornado:

https://gist.github.com/1939836

E 'tratto da una fonte più complessa, non ho provato questo succo, è polling lungo, ma tornado handlse WebSocket pure .

http://www.tornadoweb.org/documentation/websocket.html

aggiornamento:

Evitare django-websocket per l'uso in produzione. Anche lo sviluppatore principale consiglia di non farlo.

Raccomando Tornado perché è una tecnologia eccezionale che è incredibilmente più veloce/più leggera del django. Potrebbe essere utile per alcuni casi semplici. Avrai bisogno di configurare apache/nginx comunque, almeno avrai a disposizione la funzione "pagine web più veloci".

La notifica Django-Desktop si concentra sul browser chrome e richiede node.js.

aggiornamento (01/2016):

Mozilla dato soldi Django a fine 2015 per risolvere questo problema particolare, l'implementazione corrente più promizing fatta da un nucleo dev Django è questa:

https://github.com/andrewgodwin/channels

probabilmente sarà parte di Django 1.11 o 2.0

+0

thx per la vostra risposta. Devo evitare a tutti i costi ** sondaggi **. Il cliente non deve chiedere al server nuovi aggiornamenti. Aggiornerò il mio primo post con un elenco di "possibili implementazioni esistenti", ma non sono sicuro di quale di esse potrebbe essere utilizzato per il mio caso. Il polling lungo – Gero

+0

è true RealTime, basta inviare una risposta quando necessario. Ma hai tutto ciò che ti serve per fare comunicazione tra il server asincrono e il django. Evita l'accesso al DB dal tornado se usi django orm, è fatto di bloccare le chiamate. – christophe31

+0

Ho appena letto il rfc al polling lungo, ma dovrò andare con WebSockets. Hai bisogno di una delle tante implementazioni, che è in grado di lavorare con django – Gero

0

Sì, Django non è poi così grande quando si tratta di animali asincrone.Il mio consiglio per voi sarebbe quello di usare twistato in quanto ha un sacco di librerie websocket. Se hai davvero bisogno di usare django, puoi fare django come passaggio, per tutte le cose api che costruisci usando twistato.

7

Anche se è un po 'complicato da configurare (ma probabilmente la strada da percorrere), è possibile utilizzare gunicorn + gevent + socket.io.

Ho utilizzato this article per guidarmi.

Si potrebbe anche guardare eventi inviati dal server (l'articolo menzionato sopra guarda anche questo). Se soddisfano le tue esigenze, sarebbe un po 'più semplice da configurare, dato che non devi configurare socket.io e non hai bisogno di una libreria client. Una cattura però - SSE non sono supportati in IE.