Comet-style Webapp in reinem Python?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Gibt es eine reine Python-Lösung, um Comet-style Anwendungen zu bauen? Ich hätte gedacht, vielleicht im Rahmen von CherryPy, aber da habe ich nur einen Hinweis auf ein Tutorial zusammen mit Orbited gefunden.

In einem Beispiel für ein Webrahmenwerk für Clojure habe ich folgenden Code gefunden:

Code: Alles auswählen

(GET "/messages"
    (let [index (parse-int (params :index))]
        (locking request
            (unless (messages-waiting? index)
                suspend-request :messages))
        (json (messages-from index))))

(POST "/message"
    (add-message (params :message))
    (resume-requests :messages))
Dies definiert die zwei Request-Handler auf der Serverseite: Fragt ein Client nach der URL "/messages" und übergibt den Index der letzten Nachricht, die er kennt, antwortet der Server entweder mit einer Liste der neuen Nachrichten oder aber friert mit "suspend-request" die Verarbeitung ein, bis das Signal "messages" ertönt.

Wird an die URL "/message" eine neue Nachricht geschickt, wird sie zur Datenbasis hinzugefügt und dann werden alle eingefrorenen Handler erneut durchlaufen, indem sie mit "resume-requests" und dem Signal "messages" wieder erweckt wurden.

Ich finde das recht elegant und auch der client-seitige JavaScript-Code dazu ist einigermaßen übersichtlich. Je nach Browser wird per IFRAME oder XHR die URL "/messages" gepollt.

Clojure nutzt offenbar das in den Java-basierten Servlet-Container Jetty eingebauten Support für das Anhalten von Requests, was dort als (IMHO fälschlich) Continuations bezeichnet wird, obwohl es nicht an der entsprechenden Stelle weitergeht, sondern der Request neu durchlaufen wird.

Muss ich Python untreu werden?

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:Gibt es eine reine Python-Lösung, um Comet-style Anwendungen zu bauen? Ich hätte gedacht, vielleicht im Rahmen von CherryPy, aber da habe ich nur einen Hinweis auf ein Tutorial zusammen mit Orbited gefunden.
Ja, Twisted im Zusammenspiel mit Nevow bietet COMET. Nevow hat da seine eigenen Library, Athena, die man als Helper verwenden kann. Mein IRC-Web-Client nutzt eben das und es funktioniert auch durchaus.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Danke für den Hinweis, aber das Rahmenwerk ist nichts für mich - meine Frustschwelle ist heute zu gering...

Erste Schritte mit Nevow

Die Projektseite ist zwar in schickem Lila betitelt, dennoch finde ich die Dokumentation eher dürftig. Der erste Link, "The Nevow Guide" verweist auf Trac, nicht jedoch auf lesbaren Text. Mit dem API (2. Link) will ich mich nicht als erstes auseinandersetzen und auch ein Stan-Tutorial ist nicht, was ich als "Start Here" erwartet hätte.

Also versuche ich, die Software auf gut Glück mit `easy_install nevow` in einem neuen "virtualenv" zu installieren und versuche mich an Teil 1 des Tutorials.

Spontan missfällt mir der Modulname "rend" - für ein zusätzliches "er" hat's nicht mehr gereicht? Der gezeigte Quelltext ist zudem eigenartig formatiert und das Beispiel nicht lauffähig. Was bitte ist ein "tac"-File?

Das ist für ein Tutorial so mieß (und ich bin offenbar gerade so schlecht gelaunt), dass ich die Lust verliere, mich damit weiter zu beschäftigen.

Google verrät mir, das "tac"-Dateien mit `twistd -ny` gestartet werden können. Das Kommando habe ich zufällig, weil OS X offenbar twisted vorinstalliert hat. Da ich aber (natürlich) ein virtualenv benutze und `twistd` das System-Python, finde das dann nicht "nevow".

Ich versuche `easy_install twisted` und das müllt mir auch ein Dutzend neue Befehle in mein `bin`-Verzeichnis, aber danach geht es leider immer noch nicht: `Failed to load application: No module named nevow`. F*CK.

Wenn ich `import nevow` im Python-Interpreter aufrufe, bekomme ich eine unverständliche Warnung. Das war vor der Installation von twisted noch nicht der Fall. Das wird das Problem sein...

Ein `python -v` zeigt: Offenbar wird zope.interface angezogen und auch das darf nicht aus dem System kommen. Der dritte im Bunde muss also `easy_install zope.interface` sein. Wieso werden solche Dependencies nicht automatisch aufgelöst? Da es twisted doch schon so viele Jahre gibt, hätte ich besseres erwartet. Ich glaube, die wollen einfach keine neuen Anwender haben.

Nun kann ich folgenden Code als `tut1.py` abgespeichert mit `twistd -ny tut1.py` starten:

Code: Alles auswählen

from nevow import appserver, rend
from twisted.application import service, internet

class MyPage(rend.Page):
    def renderHTTP(self, ctx):
        return (
            '<html>'
            '<head><title>"Nevow Tutorial"</title></head>'
            '<body>Hi there</body></html>')

application = service.Application("tut1")
site = appserver.NevowSite(MyPage())
webService = internet.TCPServer(8080, site)
webService.setServiceParent(application)
Zu beachten ist dabei, dass die globale Variable `application` gesetzt wird, auch wenn es unnötig erscheint. Ohne geht's nicht.

Nun kann man also "Stan" nutzen, um HTML zu erzeugen (im Tutorial ist es übrigens falsch):

Code: Alles auswählen

class MyPage(rend.Page):
    def renderHTTP(self, ctx):
        return flat.flatten(
            T.html[
                T.head[T.title["Tutorial"]],
                T.body["Hi there"],
            ])
Oder es auch bleiben lassen... S-Expressions sollte man lieber den Sprachen überlassen, die sie auch erfunden haben. Ich bin bereits jetzt total angenervt, dass jede Änderung am Quelltext einen Neustart des Servers erfordert. Wenn ich mich bei Web-Entwicklung quälen will, benutze ich Java - da habe ich dann wenigstens eine schicke IDE...

Ich glaube, ich habe keine Lust mehr auf das Tutorial.

Wo ist jetzt die versprochene "Comet"-Unterstützung? Ein anderes Tutorial: Obwohl ich mir recht sicher bin, dass ich das ganze richtig aus dem Text kopiert habe, läuft es nicht. Auch der an die Seite angehängte Programmcode läuft nicht. Es scheint keine Klasse `Nevow.Athena.PageWidget` zu geben aber das ist mir jetzt auch egal.

Schrott => Tonne.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:Schrott => Tonne.
Meine Erfahrungen waren anders. Klar, schlecht dokumentiert, und auch anfangs etwas unverständlich, aber bei mir funktioniert alles wunderbar. Vielleicht auch weil mir virtualenv den Buckel runterrutschen kann, ich habe einfach Twisted genommen, zope.interfaces und Nevow und den Code ausgeführt.

Aber ich brauche mich nicht beschweren, außer dem Athena Tutorial habe ich mir auch keine weitere Dokumentation angeschaut und trotzdem meine Applikation zusammenbekommen. Einige Dinge verstehe ich selbst nicht, aber ich schätze mal dass wenn ich die Dokumentation gelesen *hätte* wäre es wohl verständlicher geworden. Oh, die Faulheit.

Das es kein Nevow.Athena gibt, liegt vermutlich daran, dass du den auskommentierten Code nicht abgetippt hast - ein Fehler, denn Nevow macht scheinbar eine Art Preprocessing und setzt da ein entsprechendes Importsystem ein. Das das in Kommentaren ist - seltsam, aber es tut.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

In dem auch von dir verlinkten Tutorial gibt es keinen auskommentierten Python-Code und ich in dem ladbaren Quelltext nicht. Und der läuft ja auch nicht. Entweder ist es ein Konfigurationsproblem (was ich mir gut vorstellen kann) oder die Versionen passen nicht mehr. Die Erwähnung eines Präprozessors erhört aber nochmal meine Ablehnung gegenüber dem System.

Virtualenv finde ich extrem wichtig, da ich nicht möche, dass mir ein Projekt irgendwelchen Code installiert, der möglicherweise andere Projekte beeinflussen kann oder auch nur mein System verschmutzt (solange man Python-Code nicht bequem automatisch wieder deinstallieren kann) und ich möchte alle Abhängigkeiten explizit verwalten.

Aber mal angenommen, das Tutorial hätte funktioniert: Die Art und Weise, wie das funktioniert, benötigt IMHO einfach viel zu viel Code (3,4 MB Nevow, 21 MB Twisted 1 MB Zope.Interfaces) und fühlt sich auch nicht eigenständig und losgelöst an, sodass ich es z.B. in Django o.ä. einfach integrieren könnte. Die Quelltextmenge könnte man als egal ansehen, aber ich weiß gerne, was ich benutze und würde daher schon gerne lesen und verstehen, wie das Rahmenwerk funktioniert. Diesen Aufwand für das Problem zu treiben, erscheint mir aber zu hoch. Letztlich sind es aber alles nur vorgeschobene Argumente für ein Bauchgefühl, dass mir die Software einfach nicht gefällt.

Stefan
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben:In dem auch von dir verlinkten Tutorial gibt es keinen auskommentierten Python-Code und ich in dem ladbaren Quelltext nicht.
Ich meinte das:

Code: Alles auswählen

// import Nevow.Athena
da du gesagt hast dass Nevow.Athena nicht gefunden wird.
sma hat geschrieben:Aber mal angenommen, das Tutorial hätte funktioniert: Die Art und Weise, wie das funktioniert, benötigt IMHO einfach viel zu viel Code (3,4 MB Nevow, 21 MB Twisted 1 MB Zope.Interfaces) und fühlt sich auch nicht eigenständig und losgelöst an, sodass ich es z.B. in Django o.ä. einfach integrieren könnte.
Also die Django-Integration ist sowieso ein Problem, aber da ist Django daran schuld, mit seinem mehr als nur blöden Umgebungsvariablen die gesetzt sein müssen um beliebige Komponenten zu verwenden. Ansonsten sollte es durchaus mit WSGI-Applikationen die etwa auf Werkzeug setzen integrierbar sein. Twisted.Web und Twisted.Web2 kann man beide überreden WSGI-Applikationen zu starten (Web braucht twisted_wsgi und Web2 hat sowas schon eingebaut).
sma hat geschrieben:Die Quelltextmenge könnte man als egal ansehen, aber ich weiß gerne, was ich benutze und würde daher schon gerne lesen und verstehen, wie das Rahmenwerk funktioniert.
Da bleiben außer web.py aber nicht viele Frameworks übrig. Django ist ja selbst schon viel zu kompliziert um einfach zum Spaß nachvollziehen zu wollen wie es funktioniert. Das ist schon schwer genug, wenn man versucht es zu erweitern. Letztendlich nutzt man von Twisted ja sowieso nur einen Bruchteil, weil es eben noch Twisted Words, Twisted Whatever mitbringt, dass man in seinem eigenem Programm höchstwarscheinlich nicht nutzt. Twisted ist nunmal nicht nur ein Webframework sondern ein Netzwerkframework mit Web-Funktionalität.

Was mir bei Athena weniger gefällt ist, dass es mir irgendwie die Kontrolle abnehmen will, um seine Abstraktionen zu ermöglichen. Ich glaube aber dass wir über so etwas auch schon im Hinblick auf Webframeworks diskutiert haben und du damit weniger Probleme gesehen hast als ich.
sma hat geschrieben:Letztlich sind es aber alles nur vorgeschobene Argumente für ein Bauchgefühl, dass mir die Software einfach nicht gefällt.
Ja, kann sein. Eine andere einfache Möglichkeit fällt mir spontan nicht ein. Die Dojo-Leute erzählen viel und gerne von COMET, also wird man da wohl noch nach COMET-Helpern gucken können (obwohl mir Dojo mit einigen Sachen schlichtweg missfällt - auch so ein Bauchgefühl).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten