Gegeben, wenn ein Benutzer /foo
auf meinem Server anfordert, sende ich die folgende HTTP-Antwort (die Verbindung wird nicht geschlossen):
Wenn der Benutzer zu /bar
geht (was 204 No Content
sendet, damit sich die Ansicht nicht ändert), möchte ich die folgenden Daten in der ersten Antwort senden.
Wie bekomme ich die zweite Anfrage, um dies aus der ersten Antwort auszulösen? Ich plane, möglicherweise eine Phantasie [Motoren, die multipart / x-mixed-ersetzen (derzeit nur Gecko)] zu unterstützen - nur E-Mail-Webapp, die Server-Push-und Ajax-Effekte ohne JavaScript, nur zum Spaß macht.
Keine vollständige Antwort, aber:
In Ihrer Frage beschreiben Sie eine Comet -Stil-Architektur. Was die Unterstützung von Kometen-Stil-Techniken in Python / WSGI betrifft, gibt es eine StackOverflow-Frage , die über verschiedene Themen spricht Python-Server mit Unterstützung für lang andauernde Anfragen a la Comet.
Interessant ist auch dieser Mail-Thread in der Python-Web-SIG: "Könnte WSGI verarbeiten Asynchrone Antwort? ". Im Mai 2008 gab es in der Web-SIG eine breite Diskussion über das Thema asynchrone Anfragen in WSGI .
Eine neuere Entwicklung ist evserver , ein einfacher WSGI-Server, der das Asynchrone WSGI-Erweiterung vorgeschlagen von Christopher Stawarz in der Web-SIG im Mai 2008.
Schließlich unterstützt der Tornado-Webserver nicht blockierende asynchrone Anfragen . Es hat eine Chat-Beispielanwendung, die lange Abfragen verwendet und Ähnlichkeiten mit Ihren Anforderungen aufweist.
Wenn das Problem darin besteht, einen Befehl von der / bar-Anwendung an die / foo-Anwendung zu übergeben und einen Servlet-ähnlichen Ansatz zu verwenden (der Python-Code wird einmal und nicht für jede Anfrage wie in CGI geladen), können Sie einige ändern Klasseneigenschaft der Anwendung / foo und bereit sein, auf die Änderung in der / foo-Instanz zu reagieren (indem der Eigenschaftsstatus überprüft wird).
Offensichtlich sollte die / foo-Anwendung nicht direkt nach der ersten Anfrage zurückkehren und den Inhalt zeilenweise ausgeben.
Dachte, das ist nur Theorie, ich habe das selbst nicht versucht.
Ich habe ein kleines Beispiel erstellt (nur zum Spaß, wisst ihr:))
%Vor%Die Idee einer geteilten Variablen- und Thread-Synchronisation (unter Verwendung eines Zustandsvariablenobjekts) basiert auf der Tatsache, dass der von CherryPyWSGIServer bereitgestellte WSGI-Server mit einem Thread versehen ist.
Nicht sicher, ob das genau das ist, wonach du suchst, aber es gibt eine ziemlich alte Art, Server Push mit einem Pantomime-Inhalt von multipart / x-mixed-replace zu machen
Im Grunde genommen verfassen Sie die Antwort als Mime-Objekt mit dem Inhaltstyp multipart / x-mixed-replace und senden die erste "Version" eines Dokuments. Der Browser hält den Socket offen.
Wenn der Server dann entscheidet, mehr Daten zu übertragen, wird eine neue "Version" des Dokuments vom Server gesendet, und der Browser ersetzt den Inhalt intelligent (innerhalb des Frames / Iframes, der den Inhalt enthält).
Dies war eine frühe Art, Webcams zu machen, bei denen der Server Bild für Bild nach unten (push) senden würde, und der Browser würde einfach immer wieder das Bild im Dokument ersetzen. Dies ist auch eine Möglichkeit, eine "Loading ..." -Nachricht über eine einzelne HTTP-Anfrage auszuführen.