Keine Highlevel-Webrahmenwerke?
Verfasst: Sonntag 27. April 2008, 11:12
Es gibt für Python ja nicht gerade wenige Webrahmenwerke. Dennoch folgen sie eigentlich alle dem selben einfachen Prinzip. Wieso gibt es eigentlich keine stärker abstrahierenden Systeme, z.B. welche, die einem Komponentenansatz folgen?
Vorbilder könnten IMHO Seaside, Wicket und ja, auch JSF oder ASP.NET sein.
Nehmen wir einmal die "Arc-Challenge" als Beispiel. Eine Webanwendung soll nach einem Namen fragen, danach eine Seite mit einem Link anzeigen und nach Klick auf den Link den Namen wieder anzeigen. Der Zustand der Webanwendung (der Name) soll dabei unsichtbar bleiben.
Wer Wicket kennt, dem wird dieses adhoc-Beispiel vertraut vorkommen:
Die Idee ist, von Dingen wir URLs komplett zu abstrahieren. Ich habe Seiten, repräsentiert durch web.Page-Objekte, die angezeigt werden können und aus Komponenten (z.B. web.Form, web.Link oder web.Label) bestehen, die den dynamischen Teil repräsentieren. Der statische Teil wäre jeweils ein Template der folgenden Art:
Das Rahmenwerk (ein Begriff, der hier sogar zutrifft, weil es nicht nur eine Sammlung von Klassen und Funktionen ist, sondern etwas, das meine Klassen einbettet und aufruft) erzeugt abhängig von einer URL das passende Seitenobjekt, stellt ggf. dessen internen Zustand wieder her und führt dann passenden Code aus. Weil ich mir leider keine Programmzustände in Form von continuations merken kann (wie bei Seaside und Lisp-Rahmenwerken) muss ich dafür sorgen, dass ich mit einem wiederhergestellten Seitenobjekt weitermachen kann.
Die Anwendung startet, indem `Start` erzeugt wird, was eine Seite darstellt, die ein Formular enthält, welches über "f" mit der Methode `submit` assoziiert wird, sodass beim Absenden der Formulardaten dann in der wiederhergestellten Seite `submit` aufgerufen wird. Der Name wird gespeichert und die Kontrolle wird an ein anderes Seitenobjekt übergeben, welches dann auch gebaut wird und welches nur einen Link anzeigt. Gleichzeitig wird eine URL generiert und derart gespeichert, dass später ein Link auf den Link dazu führt, dass `Display` dargestellt wird.
Man könnte es noch extremer machen und (wie Seaside) auf Templates verzichten:
Zu fremdartig?
Stefan
Vorbilder könnten IMHO Seaside, Wicket und ja, auch JSF oder ASP.NET sein.
Nehmen wir einmal die "Arc-Challenge" als Beispiel. Eine Webanwendung soll nach einem Namen fragen, danach eine Seite mit einem Link anzeigen und nach Klick auf den Link den Namen wieder anzeigen. Der Zustand der Webanwendung (der Name) soll dabei unsichtbar bleiben.
Wer Wicket kennt, dem wird dieses adhoc-Beispiel vertraut vorkommen:
Code: Alles auswählen
class Start(web.Page):
def setup(self):
return web.Form('f', 'submit')
def submit(name=None):
self.session.name = name
self.goto(Delay)
class Delay(web.Page):
def setup(self):
return web.Link('l', Display)
class Display(web.Page):
def setup(self):
return web.Label('l', self.session.name)
Code: Alles auswählen
<html><body><a web:id="l" href="#">Weiter</a></body></html>
Die Anwendung startet, indem `Start` erzeugt wird, was eine Seite darstellt, die ein Formular enthält, welches über "f" mit der Methode `submit` assoziiert wird, sodass beim Absenden der Formulardaten dann in der wiederhergestellten Seite `submit` aufgerufen wird. Der Name wird gespeichert und die Kontrolle wird an ein anderes Seitenobjekt übergeben, welches dann auch gebaut wird und welches nur einen Link anzeigt. Gleichzeitig wird eine URL generiert und derart gespeichert, dass später ein Link auf den Link dazu führt, dass `Display` dargestellt wird.
Man könnte es noch extremer machen und (wie Seaside) auf Templates verzichten:
Code: Alles auswählen
class Start(web.Component):
def render(self, html):
with html.form('submit'):
html.text("Name: ")
html.input('name')
html.submit()
def submit(self, name=None):
self.session.name = name
self.goto(Link)
class Link(web.Component):
def render(self, html):
html.a(Display, 'Weiter')
class Display(web.Component):
def render(self, html):
html.text("Hallo, ", self.session.name)
Stefan