2012-02-28 15 views
13

Me preguntaba cómo crear un servicio web django (responde con XML) con websockets. Ya tengo un servicio web django que acepta solicitudes XML, analiza esas solicitudes, hace una consulta a la base de datos, crea un xml de respuesta y envía ese xml de vuelta al solicitante/navegador. Solo una solicitud XML HTTP normal, donde la respuesta se muestra como xml en el navegador.WebSocket + Django python WebService

Pero, ¿cómo crearía ahora un webservice django webservice? Digamos que me gustaría enviar una respuesta xml al solicitante/navegador con los últimos datos de la base de datos cada vez que ocurre un nuevo evento mágico.

He leído muchas publicaciones y blogs, pero era un poco demasiado general. ¿Puedo resolver esto solo con django + apache o necesito algo más junto a django y otro servidor solo para manejar websockets?

Ahora mismo estoy usando django 1.3, Apache + wsgi, pero estaría listo para cambiar cualquier configuración que funcione.

Actualización:

Hay muchas posibles websockets por ahí, http://pypi.python.org/pypi?:action=search&term=websocket&submit=search pero ¿cuál podría ser utilizado en mi caso?

Respuesta

8

Lo sentimos, pero django maneja las solicitudes asincrónicas muy, muy mal, ya que es wsgi. Estará limitado por su cantidad de instancias paralelas si tiene que manejar usuarios reales. La mejor solución es usar tornado o node.js.

Tornado maneja el websocket y el largo sondeo brillantemente. Aquí está mi envoltorio para permitir obtener usuario y las sesiones de un hilo de tornado en paralelo:

https://gist.github.com/1939836

Es una adaptación de una fuente más compleja, que no probó esta GIST, es sondeo largo pero tornado handlse WebSocket, así .

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

actualización:

Evitar django-WebSocket para uso en producción. Incluso el desarrollador principal recomienda no hacerlo.

Recomiendo Tornado porque es una tecnología asombrosa que es mucho más rápida/más ligera que django. Puede ser útil para algunos casos simples. Tendrá que configurar apache/nginx de todos modos, al menos tener disponible la característica de "páginas web más rápidas".

Django-Desktop-Notification se centra en el navegador Chrome y requiere node.js.

actualización (01/2016):

Mozilla dio dinero a Django a finales de 2015 para resolver este tema en particular, la actual implementación más promizing hecha por un desarrollador del núcleo Django es éste:

https://github.com/andrewgodwin/channels

probablemente será parte de Django 1.11 o 2.0

+0

thx por su respuesta. Tengo que evitar a cualquier costo ** encuesta **. El cliente no debe pedirle al servidor nuevas actualizaciones. Actualizaré mi primera publicación con una lista de "posibles implementaciones existentes", pero no estoy seguro de cuál de ellas podría usarse para mi caso. – Gero

+0

el sondeo largo es verdadero RealTime, solo envía la respuesta cuando sea necesario. Pero tiene todo lo que necesita para establecer comunicación entre tornado async server y django. Evite el acceso a DB desde tornado si usa django orm, está hecho de llamadas de bloqueo. – christophe31

+0

Acabo de leer el rfc para un sondeo largo, pero tendré que ir con WebSockets. Necesita una de las muchas implementaciones, que se puede usar con django – Gero

0

Sí, Django no es tan grande cuando se trata de materias asíncronos.Mi consejo para usted sería usar twisted ya que tiene muchas bibliotecas de websocket. Si realmente necesitas usar django ... puedes hacer que django actúe solo como un pase, para todas las cosas api que construyas usando twisted.

7

Aunque es un poco complicado de configurar (pero probablemente sea el camino a seguir), puedes usar gunicorn + gevent + socket.io.

Utilicé this article para guiarme a través de él.

También puede consultar los eventos enviados por el servidor (el artículo mencionado anteriormente también lo ve). Si se ajustan a tus necesidades, sería un poco más fácil de configurar, ya que no tienes que configurar socket.io y no necesitas una biblioteca cliente. Una pega, sin embargo - SSE no son compatibles en IE.