pyHTMLutils - HTTP-Server & HTML-Template-Engine - MVC

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.

Wie findet Ihr die Idee?

schei*e!
10
100%
schön!
0
Keine Stimmen
 
Abstimmungen insgesamt: 10
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

Samstag 1. Dezember 2007, 21:08

Nabend!

Habe gerade mal wieder im 'Dynamische Webinhalte und Netzwerkprogrammierung'-Forum gelesen und mir mal wieder bei allen Python-HTML-Template-Engines gedacht: "Was'n das für ne scheiße?!". Gut, ich habe mir bisher nicht all zu viele angesehen, aber das was ich gesehen habe, fand ich nicht gut. Ich kann mich ja davon überzeugen lassen, dass die Sachen trotzdem gut sind, aber gefallen werden sie mir dann imemr noch nicht ... denk ich :-P

Deshalb habe ich damit angefangen eine schöne HTML-Template Engine zu programmieren. Dazu kam dann auch irgendwie ein HTTPServer (basierend auf BaseHTTPServer) und ein RequestHandler. Das ganze soll nach dem MVC-Prinzip arbeiten, soll ... Noch is das ganze nicht so weit, die HTML-Template-Engine läuft aber schon ganz gut :-)

Was ist eine schöne Template-Engine? Darüber kann man sich 'while true' streiten, aber ich finde folgendes schön:

Code: Alles auswählen

<html>
<head>
<title>Site: <%= params['action'] %></title>
</head>
<body>
<%< banner.phtml %>
<hr/>
Rechnung: 5 * 5: <%= str(5*5) %>
<hr/>
<ul>
<%! for name in ['Ich', 'Du', 'Er', 'Sie', 'Es']: %>
  <li>
  <%! if name == 'Ich': %>
    Hallo Chef!
  <%! else: %>
    Hallo <%= name %>
  </li>
</ul>
<hr/>
<p align="center" id="footer">
<%! import time %>
generated at: <%= time.ctime() %>
</p>
</body>
</html>
Das kleine Beispiel soll zeigen was man damit machen kann ... also, es gibt drei arten von Commands:
  • <%= Wie auch bei RubyOnRails wird hier der String in den Output geshrieben [via eval()]
    <%! Führt beliebigen Python-Code aus [via compile() und eval()]
    <%< Include eines weiteren Templates oder einfach einer Datei
Und das Einrücken ist wie bei Python auch wichtig ;-)

wie findet ihr das ganze? Denkt ihr jetzt auch "Was'n das für ne scheiße?!" oder eher "Schöööön!"? :-P
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Samstag 1. Dezember 2007, 21:43

Mir würde da die Vererbung wie sie Mako, Jinja etc. bieten fehlen ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 1. Dezember 2007, 22:00

THExSYSTEM hat geschrieben:Denkt ihr jetzt auch "Was'n das für ne scheiße?!" oder eher "Schöööön!"? :-P
Halo THExSYSTEM!

Ich halte mich kurz:

http://www.cheetahtemplate.org/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

Samstag 1. Dezember 2007, 22:11

Auch nicht schlecht, wusste nicht das es sowas schon gibt :oops: Naja, werde trotzdem weiter daran arbeiten ... Meinen HTML-Templates kann man übrigens auch 'locals' und 'globals' zum rendern übergeben ;-)

@veers: Was für eine Vererbung?
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Samstag 1. Dezember 2007, 22:28

[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 1. Dezember 2007, 22:39

Juhu, Python-Code in Templates ausführen. Hat schon in PHP so gut funktioniert. Mein Problem damit ist, dass man dann dazu neigt, wichtigen Code ins Template auszulagern.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 1. Dezember 2007, 22:39

THExSYSTEM hat geschrieben:Was für eine Vererbung?
Hallo!

Und von mir auch noch ein Link zu diesem Thema:
http://gelb.bcom.at/trac/misc/wiki/Tuto ... nvererbung

mfg
Gerold
:-)

PS: Nahe an deiner Syntax: http://karrigell.sourceforge.net/en/pyt ... dehtml.htm
Zuletzt geändert von gerold am Samstag 1. Dezember 2007, 22:48, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Samstag 1. Dezember 2007, 22:42

Mööp, http://jinja.pocoo.org/documentation/inheritance währe die aktuelle Version :D


Ansonsten weiß ich nicht, was die Leute immerwieder dazu bringt, neue Template Engines zu schreiben. Gibts nichts Sinnvolleres? Die aktuellen machen Ihre Aufgabe wirklich schön.

Jinja kannst du sogar etwas in der Syntax anpassen, kann viele Dinge, die Django-Templates auch können (is schließlich das Vorbild damals gewesen, was überholt wurde) und reichlich mehr. Direkter Draht zu den Entwicklern gibts hier im Forum ebenfalls :)

Wenn die dir nicht gefällt, gibts noch Genshi, Mako-Templates, was sehr nah an deine Syntax rankommt und viele viele mehr, wie oben benannt.

Meinen Geschmack trifft deine Variante jedenfalls nicht.

MFG EnTeQuAk


Edit:
Leonidas hat geschrieben:Juhu, Python-Code in Templates ausführen. Hat schon in PHP so gut funktioniert. Mein Problem damit ist, dass man dann dazu neigt, wichtigen Code ins Template auszulagern.
Und es gibt den Template-Entwicklern einfach zu viele Möglichkeiten, die sich nicht richtig Steuern lassen, finde ich.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 1. Dezember 2007, 22:52

Nun, da ich tippen üben muss...

Ahja, willkommen im Forum, THExSYSTEM.

Was das Rendern von `globals()` und `locals()` angeht, das geht auch mit normalen String-Templates...
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 2. Dezember 2007, 14:32

Generell finde ich ja, selber machen übt. Daher erstmal "daumen hoch". Bei Template-Lösungen gibt es ja zwei Denkschulen für die dynamischen Anteile:
  • - Es muss eine eigene Sprache sein, die den Anwender vor sich selbst schützt
    - Die volle Mächtigkeit der Programmiersprache soll zur Verfügung stehen
Hat man sich hier entschieden, kann man nur noch über die Syntax und den Funktionsumfang streiten. Soll das Ergebnis etwa weiterhin XML-konform sein, oder ist <% nun besser als {% usw.

Python bildet bekanntlich Blöcke durch Einrückung (was ich durchaus elegant finde), aber selbst bei Template-Systemen, die auf Python aufbauen, führen die meisten Blockendemarken ein. THExSYSTEMs System ist hier offenbar eine Ausnahme. Macht es das bereits besonders?

Ich wundere mich eigentlich, dass noch niemand (jedenfalls kenne ich keine Implementierung) konsequent Pythons Stil, Blöcke durch Einrückung zu definieren, auf eine XHTML-erzeugende Template-Sprache übertragen hat. Ich glaube, so etwas könnte mir gefallen.

Bei diesem Beispiel habe ich mich von HAML inspirieren lassen:

Code: Alles auswählen

%html
  %head
    %title Site: ${params['action']}
  %body
    =include('banner.phtml')
    %hr/
    Rechnung: ${5 * 5}
    %hr/
    %ul
      -for name in ['Ich', 'Du', 'Er', 'Sie', 'Es']:
        %li Hallo ${'Chef' if name == 'Ich' else name}
    %hr/
    %p#footer{align="center"}
      -import time
      generated at ${time.ctime()}
Tags werden mit % eingeleitet, Code mit - oder =. Die häßlichen <hr/> müssen mit / als leere Elemente markiert werden, der Rest kann dafür auf Blockendemarkierungen verzichten. Die for-Schleife bettet sich jetzt ganz natürlich ein. Codeeinschlüsse im statischen Text werden mit ${} markiert.

Ich hatte mal einen proof of principle gebaut, doch eine gute Fehlerbehandlung fand ich zu schwer. Wie erzeugt man vernünftige Fehlermeldungen für die richtigen Zeilennummern? Ist es wirklich eine gute Idee, direkt Python zu benutzen? Ein eigener Evaluator für Ausdrücke, wie ihn etwa Django kennt, könnte verzeihender und gleichzeitig mächtiger (Stichwort Filter) sein.

Stefan
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

Sonntag 2. Dezember 2007, 14:58

@sma {
Finde dein System / deine Idee gar nicht schlecht ;-) obwohl es wieder eine eigene Sprache ist. Gerade das will ich ja nicht, dass man wieder eine "neue" Sprache und deren Syntax lernen muss. Es soll weiterhin möglichst Python-Code sein den ich zu schreiben habe. Die Sache mit den Blockendmarken stört mich bei den anderen System fast am meisten, deswegen muss man bei mir halt einrücken, aber das ist ja auch Python-Like und wir programmieren ja in Python, oder? ;-)
Python bildet bekanntlich Blöcke durch Einrückung (was ich durchaus elegant finde), aber selbst bei Template-Systemen, die auf Python aufbauen, führen die meisten Blockendemarken ein. THExSYSTEMs System ist hier offenbar eine Ausnahme. Macht es das bereits besonders?
Was meinst du mit: 'Macht es das bereits besonders?'. Wenn du damit meinst, ob das System es schon besonders tut: Ja, das ding läuft schon :-)
}

@gerold: Karrigel sieht ja sehr gut aus :-) nur das man da noch mit prints arbeiten kann, aber das könnte ich auch noch einbauen ;-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 2. Dezember 2007, 15:47

Ich meinte besonders im Sinne von interessant und be(tr)achtenswert.

Ich würde übrigens sagen, durch <%! %> usw. hast du eine eigene Sprache erschaffen. Die Sprache ist sogar recht groß, denn sie ist ein Superset von Python. Allerdings ist der Teil, der neu ist, recht übersichtlich.

Nicht so übersichtlich finde ich das Ergebnis. Denn ohne gutes Syntax-Highlighting fallen die <% ... %> in den vielen HTML-Tags kaum auf. Außerdem wird der, der zwar HTML, aber nicht Python kennt, verwundert sein, dass auf einmal Leerzeichen signifikant sind.

Für meine Idee (ne, nicht wirklich meine) beanspruche ich bessere Übersichtlichkeit dadurch, dass es kürzer ist. Außerdem kann man kein nicht-wohlgeformtes XML damit erzeugen. Das vermeidet eine häßliche Fehlerquelle.

Stefan
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 2. Dezember 2007, 16:41

Der Nachteil hingegen ist, dass man nicht so einfach bestehende HTML-Blöcke einfügen kann.

Außerdem, wie sieht es mit dem Einbetten von CSS und JavaScript aus?
Zuletzt geändert von Leonidas am Samstag 16. Februar 2008, 18:16, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Sonntag 2. Dezember 2007, 16:55

Ersteres empfinde ich nicht als Nachteil. Im Gegenteil, ich will ja den Code strukturieren und ggf. durch Hilfsfunktionen abstrahieren und keine fertigen Codeschnipsel einbetten müssen.

Ohne jetzt nachzuschauen, was HAML für JavaScript und CSS anbietet, würde ich sagen, dass da keine prinzipiellen Probleme sind:

Code: Alles auswählen

%html
  %head
    %style{type="text/css"}
      body: { color: red; font-size: 144pt }
  %body
    %script{type="text/javascript"}
      alert("Hallo")
    %p Wo ist das Problem?
Da man JavaScript gerne nochmal in <![CDATA[...]]> einschließen möchte, könnte man vielleicht sowas erlauben:

Code: Alles auswählen

%body
  !script
    if (a < 5 && b == c) alert("Hallo")
  %p Das ! fügt dann <![DATA[ ... ]]> hinzu
Für CSS bietet der Macher von HAML nochmal eine eigene Sprache namens SASS.
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

Sonntag 2. Dezember 2007, 17:18

Der nachteil Hingegen ist, dass man nicht so einfach bestehende HTML-Blöcke einfügen kann.
Also, ich kann reine HTML-Blöcke (also, wenn sie frei von <% ... %> sind) per include (<%< ... %>)einbinden, egal ob oder wie diese eingerückt sind usw. :-) ... vielleicht war deine Aussage aber auch nur auf HAML bezogen :roll:

EDIT#1:
@sma: Naja, wenn man das als Sprache bezeichnen mag, dann besteht diese aus 3 Wörtern ;-) eval, exec und include ... und das kann ich mir gut merken :-P
Antworten