Frage

Ich habe eine Django -Webanwendung. Ich habe auch einen Zauberserver mit Twisted Laufen auf derselben Maschine mit Django (ausgeführt localhost:8090). Die Idee, wenn der Benutzer eine Aktion ausübt, kommt an Django ein, was wiederum eine Verbindung zu diesem verdrehten Server herstellt und Server Daten an Django zurücksendet. Schließlich legt Django diese Daten in eine HTML -Vorlage ein und dient sie dem Benutzer zurück.

Hier habe ich ein Problem. In meiner Django -App erstelle ich, wenn die Anfrage eingeht, einen einfachen Twisted -Client, um eine Verbindung zum lokal ausgeführten Twisted Server herzustellen.

...
        factory = Spell_Factory(query) 
        reactor.connectTCP(AS_SERVER_HOST, AS_SERVER_PORT, factory)
        reactor.run(installSignalHandlers=0)
        print factory.results
...

Das reactor.run() verursacht ein Problem. Da es sich um eine Ereignisschleife handelt. Wenn der gleiche Code das nächste Mal von Django ausgeführt wird, kann ich keine Verbindung zum Server herstellen. Wie geht man damit um?

War es hilfreich?

Lösung

Die obigen zwei Antworten sind korrekt. Bedenken Sie jedoch, dass Sie bereits eine Rechtschreibung implementiert haben Server dann Führen Sie es als eins aus. Sie können damit beginnen, es auf derselben Maschine wie ein separater Vorgang auszuführen - at localhost:PORT. Im Moment haben Sie bereits über eine sehr einfache binäre Protokollschnittstelle verfügen - Sie können einen ebenso einfachen Python -Client mit den Standard -Libs implementieren socket Schnittstelle im Blockierungsmodus.

Ich schlage jedoch vor, mit zu spielen twisted.web und entdecken Sie eine einfache Webschnittstelle. Sie können JSON verwenden, um Daten zu serialisieren und zu deserialisieren - was von Django gut unterstützt wird. Hier ist ein sehr schnelles Beispiel:

import json
from twisted.web import server, resource
from twisted.python import log

class Root(resource.Resource):
    def getChild(self, path, request):
        # represents / on your web interface
        return self

class WebInterface(resource.Resource):
    isLeaf = True
    def render_GET(self, request):
        log.msg('GOT a GET request.')
        # read request.args if you need to process query args
        # ... call some internal service and get output ...
        return json.dumps(output)

class SpellingSite(server.Site):
    def __init__(self, *args, **kwargs):
        self.root = Root()
        server.Site.__init__(self, self.root, **kwargs)
        self.root.putChild('spell', WebInterface())

Und um es auszuführen, können Sie das folgende Skelett verwenden .tac Datei:

from twisted.application import service, internet

site = SpellingSite()
application = service.Application('WebSpell')
# attach the service to its parent application
service_collection = service.IServiceCollection(application)
internet.TCPServer(PORT, site).setServiceParent(service_collection)

Wenn Sie Ihren Dienst als ein weiterer erstklassiger Service ausführen, können Sie ihn eines Tages auf einem anderen Computer ausführen, wenn Sie die Bedürfnisse finden. Die Belegung einer Weboberfläche erleichtert es einfach, ihn auch hinter einem Reverse -Proxying -Balancer zu skalieren.

Andere Tipps

reactor.run() sollte nur einmal in Ihrem gesamten Programm aufgerufen werden. Betrachten Sie es nicht als "Starten Sie diese eine Anfrage, die ich habe", betrachten Sie es als "Ganze von Twisted".

Das Ausführen des Reaktors in einem Hintergrund -Thread ist eine Möglichkeit, dies zu umgehen. Dann kann Ihre Django -Anwendung verwenden blockingCallFromThread Verwenden Sie in Ihrer Django -Anwendung und verwenden Sie eine verdrehte API, wie Sie es jeder blockierenden API tun würden. Sie benötigen jedoch ein wenig Zusammenarbeit von Ihrem WSGI -Container, da Sie sicherstellen müssen, dass dieser Hintergrund -Twisted -Faden zu geeigneten Zeiten gestartet und gestoppt wird (wenn Ihr Dolmetscher initialisiert und abgerissen wird).

Sie können auch Twisted als WSGI -Behälter verwenden und müssen dann nichts Besonderes anfangen oder stoppen. blockingCallFromThread Wird einfach sofort arbeiten. Siehe die Befehlszeile Hilfe für twistd web --wsgi.

Sie sollten den Reaktor stoppen, nachdem Sie Ergebnisse vom Twisted Server oder einem Fehler/einer Auszeit von Timeout erhalten haben. Auf jeder Django -Anfrage, bei der Sie Ihren verdrehten Server abfragen müssen, sollten Sie den Reaktor ausführen und dann stoppen. Es wird jedoch nicht von verdrehter Bibliothek unterstützt - Reaktor ist nicht neu startbar. Mögliche Lösungen:

  • Verwenden Sie separate Thread für Twisted Reactor, aber Sie müssen Ihre Django-App mit Server bereitstellen, was Unterstützung für langlebige Threads bietet (ich habe jetzt keine davon, aber Sie können Ihre eigene leicht schreiben :-)).

  • Verwenden Sie Twisted nicht für die Implementierung des Client -Protokolls. Verwenden Sie einfach einfache STDLIB's socket Modul.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top