Minimales Webrahmenwerk ohne newstyle-Klassen?

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

Kennt/hat jemand vielleicht ein möglichst kleines (gerne auch primitives) WSGI-basiertes Webrahmenwerkchen, welches keine newstyle-Klassen benutzt?

Ich hätte gerne ein Beispiel für einen Python-Bytecode-Interpreter, an dem ich mich langhangeln kann und fehlende Funktionen implementieren kann. Leider kann ich keine newstyle-Klassen. Auf eval(), Datenbank-API oder AST-Manipulationen würde ich auch gerne verzichten, eigentlich alle nicht-trivialen Funktionen der Standardbibliothek sind tabu. Ich möchte halt wenigstens nominell mein Ziel, ein Python-Webrahmenwerk mittels Interpreter laufen zu lassen, erreichen...

Vielleicht muss ich mir selbst etwas schreiben, das so aussieht wie web.py, aber intern einfacher gestrickt ist. Schaue ich mir das Hallo-Welt-Beispiel von web.py an, muss ich eigentlich nur zwei Funktionen haben: `web.run` und `web.input`. Erstere Methode sagt, was für eine URL aufgerufen werden soll. Die andere greift auf die Requestparameter zu.

Web.py scheint globale Variablen und Funktionen zu lieben, alles steckt da in einer thread-lokalen Variable "ctx", auf die dann die globalen Funktionen zugreifen. Besser ist IMHO, die Exemplare der Klassen zu benutzen, die die GET und POST-Methoden tragen. Also:

Code: Alles auswählen

class hello(web.request):
    def GET(self, name):
        i = self.input(times=1)
        if not name: name = 'world'
        for x in range(int(i.times)):
            print "Hello", name

web.run('/(.*)', hello)
Stefan
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

mach doch einfach ein noop object rein in deinen Interpreter wo das object eine classobj Metaklasse hat so wie oldstyle-Klassen. Das dürfte für 90% der Fälle ausreichend sein.
TUFKAB – the user formerly known as blackbird
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Leider ist's nicht so einfach. Mir machen hauptsächlich eigene Unterklassen von Standardklassen Probleme. Die ganzen Methoden dieser Klassen habe ich auch nicht.

Meine einzige eingebaute Funktion ist zur Zeit `range()` damit einfache for-Schleifen funktionieren. Ich bin da noch ganz am Anfang ;)

Über simpleweb-py hatte ich zwischenzeitlich Yaro gefunden und davon inspiriert habe ich mir jetzt einen minimalen Wiki auf ein paar eigenen Klassen in knapp 100 Zeilen gebaut.

Code: Alles auswählen

...

class view(request):
  def GET(self, name):
    text = load_page(name)
    if not text:
      self.res.redirect("/%s;edit" % name)
    return [ "...", text, "..."]

...

urls = (
    '/(.*);edit', edit,
    '/(.*);save', save,
    '/(.*)',      view,
)

def app(environ, start_response):
  path = environ['PATH_INFO']
  for i in range(0, len(urls), 2):
    m = re.match(urls[i] + "$", path)
    if m: return urls[i + 1](environ, start_response)(m.groups())
Leider sterbe ich zur Zeit bereits an der ersten Zeile (nicht zu sehen), die das re- und cgi-Modul importiert und ich habe noch keine gute Idee, wie ich in Java diese eingebauten (ich betrachte die eine Funktion, die ich von cgi brauche, ebenfalls als eingebaut) Module am besten repräsentiere.

Stefan
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Ich versteh immer noch nicht was du mit dem Projekt bezwecken willst... Abgesehen davon, bist du dir sicher, dass du Strichpunkte in deinen URLs willst? Das würde nämlich eine Params Sektion einleiten und dazu sind die falsch formattiert.
TUFKAB – the user formerly known as blackbird
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Die Semikolonze sind iirc auch in Selector (ebenfalls von Luke Arno, neben anderen Paketen mit Bezug zu Web und WSGI) gängig. Mir gefallen sie ebenfalls nicht und der von mitsushiko genannte Grund ist (für solche Fälle) nicht von der Hand zu weisen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Die Semikolons erfüllen ihren Zweck in meinem Beispiel. Ich hätte auch `/edit/(.*)` benutzen können, alles egal, hauptsache eindeutig. Da ich keinerlei Quoting benutze ist das für die Praxis sowieso nicht tauglich.

Mir geht es nur um das Prinzip. Ich weiß nicht, wie ich dir das Projekt außer durch Spaß am Lernen begründen soll.

Übrigens, laut RFC 3986 bildet das, was ich da benutze sehr wohl einen gültigen URI (die Verallgemeinerung von URL). Wir haben da einen hier-part in Form eines path-absolute, was eine mit "/" beginnende Folge von durch "/" getrennten segments ist, die aus pchars bestehen, welches sub-delims seinen können und da gehört dann auch ";" dazu. Das war auch schon in dem veralteten ursprünglichen RFC 1738 so. Letzterer erwähnt nur für FTP-URLs, dass es ein ";type=..." gibt. Aber auch egal, Pfad-Parameter sind (außer vielleicht die jsessionids von JavaEE-Servlet-Containern) eher ungewöhnlich und kreative Einsätze von ";" sah man eine Zeitlang bei Rails, zum Beispiel.

Stefan
Antworten