UI-Module in der Tornado Template-Engine
Verfasst: Sonntag 13. September 2009, 18:08
Tornados Django-ähnliche Template-Sprache hat eine IMHO interessante kleine Erweiterung, auf die ich mal hinweisen wollte. Man kann UI-Module, die wenn man mich fragt, ja besser UI-Komponenten geheißen hätten, damit man sie nicht mit Python-Modulen verwechselt, schreiben, mit denen man wiederverwendbare Komponenten realisieren kann, die ihr eigenes CSS oder JavaScript mitbringen.
Hier ist ein Beispiel:
Die Klasse `Teaser` muss registriert werden, dann kann man sie in Templates über `modules` ansprechen und beliebige Dinge tun, die letztlich einen String erzeugen, der an der passenden Stelle eingefügt werden. Im einfachsten Fall kann man z.B. ein spezielles Template einbinden. Wird so ein Modul benutzt, werden automatisch einmal die deklarierten CSS- oder JavaScript-Dateien zur Seite hinzugefügt.
Mir gefällt die Idee. Für "echte" Komponenten wäre es jedoch nett, wenn man den Rumpf einer Komponente wieder im Template definieren könnte, etwa wenn man etwas haben will, das einen Rahmen oder eine Box generisch darstellen soll.
Djangos Inclusion Tags sind ähnlich, aber aufwendiger zu definieren und sie können nicht der Seite CSS oder JavaScript hinzufügen. Djangos Form Widgets können letzteres, sind aber nicht mit Templates gestaltbar.
Defnull, bitte sowas auch in Bottle einbauen :)
Stefan
Hier ist ein Beispiel:
Code: Alles auswählen
# uimodules.py
class Teaser(tornado.web.UIModule):
def css_files():
return ["teaser.js"]
def render(self, article):
return self.render_string("teaser_%s.html" % article.kind, article=article)
# index.html
{% for article in featured_articles %}
{{ modules.Teaser(article) }}
{% end %}
Mir gefällt die Idee. Für "echte" Komponenten wäre es jedoch nett, wenn man den Rumpf einer Komponente wieder im Template definieren könnte, etwa wenn man etwas haben will, das einen Rahmen oder eine Box generisch darstellen soll.
Djangos Inclusion Tags sind ähnlich, aber aufwendiger zu definieren und sie können nicht der Seite CSS oder JavaScript hinzufügen. Djangos Form Widgets können letzteres, sind aber nicht mit Templates gestaltbar.
Defnull, bitte sowas auch in Bottle einbauen :)
Stefan