13 Stimmen

WebSocket + Django python WebService

Ich habe mich gefragt, wie man einen Django-Webservice (antwortet mit XML) mit Websockets erstellen. Ich habe bereits ein django Webservice, die XML-Anfragen akzeptiert, parsen diese Anfragen, macht eine Datenbankabfrage, erstellt eine Antwort-XML und senden, dass Xml zurück an den Anforderer/Browser. Eine normale HTTP-XML-Anfrage, wobei die Antwort als XML im Browser angezeigt wird.

Aber wie würde ich jetzt einen Websocket django Webservice erstellen? Sagen wir, ich möchte eine XML-Antwort an den Anforderer/Browser mit den neuesten Daten aus der Datenbank senden, wenn ein neues magisches Ereignis eintritt.

Ich habe viele Beiträge und Blogs gelesen, aber irgendwie war das alles zu allgemein. Kann ich dies nur mit django + Apache lösen oder brauche ich etwas anderes neben django und einen anderen Server nur um Websockets zu behandeln?

Ich bin gerade jetzt mit django 1.3, Apache + wsgi, aber ich wäre bereit, jede Konfiguration, die funktionieren würde zu wechseln.

Aktualisierung:

Es gibt viele mögliche Websockets da draußen, http://pypi.python.org/pypi?:action=search&term=websocket&submit=search aber welche könnte in meinem Fall verwendet werden?

9voto

christophe31 Punkte 5977

Es tut mir leid, aber django behandelt async-Anfragen sehr sehr schlecht, da es wsgi ist. Sie werden durch die Anzahl der parallelen Instanzen limitiert, wenn Sie echte Benutzer bedienen müssen. Die beste Lösung ist, Tornado oder Node.js zu verwenden.

Tornado beherrscht Websocket und Long Polling hervorragend. Hier ist mein Wrapper, um Benutzer und Sitzungen von einem parallelen Tornado-Thread zu erhalten:

https://gist.github.com/1939836

Es ist von einer komplexeren Quelle angepasst, ich habe nicht getestet, diese gist, es ist lang Polling, aber Tornado handlse WebSocket als gut.

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

aktualisieren:

Vermeiden Sie django-websocket für den produktiven Einsatz. Sogar der Hauptentwickler empfiehlt es nicht.

Ich empfehle Tornado, weil es eine großartige Technologie ist, die verdammt viel schneller/leichter ist als Django. Sie kann für einige einfache Fälle nützlich sein. Sie müssen Apache/Nginx sowieso konfigurieren, damit zumindest die Funktion "schnellere Webseiten" verfügbar ist.

Django-Desktop-Notification konzentriert sich auf den Chrome-Browser und erfordert node.js.

update (01/2016):

Mozilla gab Ende 2015 Geld an django, um dieses Problem zu lösen. Die derzeit vielversprechendste Implementierung, die von einem django-Kernentwickler gemacht wurde, ist diese:

https://github.com/andrewgodwin/channels

Es wird wahrscheinlich Teil von django 1.11 oder 2.0 sein

7voto

Vlad A. Ionescu Punkte 2460

Obwohl es ein bisschen kompliziert zu installieren (aber wahrscheinlich der Weg zu gehen), könnten Sie gunicorn + gevent + socket.io verwenden.

Ich habe dieser Artikel um mir den Weg zu weisen.

Sie können sich auch die vom Server gesendeten Ereignisse ansehen (der oben genannte Artikel befasst sich auch damit). Wenn diese Ihren Bedürfnissen entsprechen, wäre es etwas einfacher einzurichten - da Sie socket.io nicht einrichten müssen und keine Client-Bibliothek benötigen. Einen Haken hat die Sache allerdings - SSE werden im IE nicht unterstützt.

0voto

Milind Punkte 530

Ja, Django ist nicht ganz so toll, wenn es um asynchrone Sachen geht. Mein Rat für Sie wäre, Twisted zu verwenden, da es eine Menge von Websocket-Bibliotheken hat. Wenn Sie wirklich brauchen, um django zu verwenden..Sie können django handeln nur als ein Pass-Through, für alle api Sachen, die Sie mit Twisted bauen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X