Seite 1 von 1

Gibt es ein Python-Komponenten-Framwork?

Verfasst: Dienstag 28. April 2009, 17:54
von deamon
Hallo,

gibt es ein Komponenten-Framework wie Apache Wicket für Python? Also ein Framework wo z. B. ein Eingabefeld oder ein Formular Objekte im Sinne der objektorientierten Programmierung sind?

Verfasst: Dienstag 28. April 2009, 18:12
von Leonidas
Sicher, Django newforms, WTForms oder zine.forms haben komponentenbasierte Formulare.

Verfasst: Dienstag 28. April 2009, 20:41
von sma
Leonidas, dem würde ich gar nicht zustimmen. Wicket funktioniert grundsätzlich anders als Django mit newforms und wahrscheinlich auch WTForms (was in dem Crashkurs-Dokument genauso aussieht). zine.forms kenne ich nicht. Nagare (abgeguckt von Seaside) geht schon eher in diese Richtung.

Etwas wie Wicket wäre in der Tat für Python nicht schlecht. Meines Wissens gibt es da nichts Vergleichbares. Müsste man mal machen...

Stefan

Verfasst: Dienstag 28. April 2009, 21:33
von DasIch
Wenn man sowas haben will sollte man sich für Python aber nicht unbedingt an Wicket orientieren. Nitrogen erscheint mir im Vergleich zu Wicket deutlich attraktiver.

Verfasst: Mittwoch 29. April 2009, 07:23
von Leonidas
sma hat geschrieben:Leonidas, dem würde ich gar nicht zustimmen. Wicket funktioniert grundsätzlich anders als Django mit newforms und wahrscheinlich auch WTForms (was in dem Crashkurs-Dokument genauso aussieht).
Ich kenne Wicket nicht, bin nur nach der Beschreibung des OP gegangen.

Und Nagare scheint mir ziemlich tot zu sein. Der IRC-Channel ist total still und die Webseite war das letzte Mal als ich geschaut habe down.

Verfasst: Mittwoch 29. April 2009, 09:05
von sma
Etwas wie Apache Wicket könnte sich in Python so anfühlen.

Wir bauen ein Gästebuch, eine Webseite, auf der Leute Kommentare hinterlassen können.

Dies ist so ein Kommentar:

Code: Alles auswählen

class Comment(object):
    def __init__(self, text=""):
        self.text = text
        self.date = datetime.now()
Dies ist die Webseite. Sie ist eine Komponente und besteht aus weiteren Komponenten. Jede Komponente wird als Klasse realisiert:

Code: Alles auswählen

class GuestBook(web.Page):
    comments = [] # database
    
    def __init__(self):
        self.add(self.CommentForm("form"))
        self.add(self.CommentListView("comments", self.comments))

    class CommentForm(web.Form):
        def __init__(self, name):
            web.Form.__init__(self, name)
            self.comment = Comment()
            self.add(web.TextArea("text", web.PropertyModel(self.comment, "text")))
    
        def on_submit(self):
            GuestBook.comments.append(Comment(self.comment.text))
            self.page.comments.model_changed()
            self.comment.text = ""

    class CommentListView(web.ListView):
        def __init__(self, name, model):
            web.ListView.__init__(self, name, model)
    
        def populate_item(self, item):
            comment = item.model_object
            item.add(web.Label("date", comment.date))
            item.add(web.MultiLineLabel("text", comment.text))
Dazu kommt ein Template, das über die "wicket:id"-Marker an die Komponenten gebunden wird:

Code: Alles auswählen

<html><body>
<form wicket:id="form">
  <textarea wicket:id="text">...</textarea>
  <input type="submit"/>
</form>
<div wicket:id="comments">
  <p><span wicket:id="date">1.1.2004</span><br/><span wicket:id="text">...</span></p>
</div>
</body></html>
Nun braucht man noch etwas, das alles zusammenhält:

Code: Alles auswählen

class GuestBookApplication(web.Application):
    home_page = GuestBook
Meine direkte Translation von Java fühlt sich in Python noch etwas hölzern an. Wicket-Code wimmelt von inneren Klassen und impliziten Zuweisungen. Für Python musste ich beide Komponenten-Klassen explizit machen. Und es wimmelt dort nun von "self"s. Implizite Zuweisungen gibt es in Python nicht, an einer Stelle habe ich daher angenommen, dass ich mit ".comments" auf eine unter dem Namen "comments" hinzugefügte Komponente zugreifen kann. Und offenbar kommen alle Klassen des Rahmenwerks aus dem Modul "web".

Stefan