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
 
Insgesamt abgegebene Stimmen: 10
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

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:

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:

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:

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:

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

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 (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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:

@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

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
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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:

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sma hat geschrieben: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.
Ich finde es praktisch Codeschnippsel einzupassen. So suche ich mir nur Code via Suchmaschine, passe den an, setze dann noch Template-Marku rein und bin fertig. Das ist mit HAML dann etwas komplizierter. Das ist auch das, was mich von breve etwas abgehalten hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Sowas ähnliches gibts in Werkzeug und wir raten von der Verwendung ab, weils besseres gibt: http://werkzeug.pocoo.org/documentation/templates

Unterschied: endif/endfor statt Einrückung, weil das wesentlich weniger verwirrt. Beispieltemplate:

Code: Alles auswählen

<h1>$escape(title)</h1>
<ul>
<% for link in links %>
  <li><a href="$escape(link.href)">$link.html_title</a></li>
<% endfor %>
</ul>
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

sma hat geschrieben: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

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()}
Auch wenn ich den ersten Ansatz besser finde (Keine Programmlogik in Templates) finde ich den Ansatz zumindest interessant, Python direkt in den Templates zu bauen.
Wenn schon, dann sollte es aber 100% Python sein... Wie wäre es damit:

Code: Alles auswählen

<head><title>{{ title|escape }}</title></head>
<body>
{% python %}
def bsp(no):
    print("Test %s" % no)
    
for no in xrange(10):
    bsp(no)
{% endpython %}
</body>
</html>
Also dann man explizit einen Python Code Bereich festlegt. Darin kann man ganz normalen Python Code rein packen.

Aber wie gesagt, eigentlich bin ich dagegen, das man Programmcode in Template baut...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
THExSYSTEM
User
Beiträge: 6
Registriert: Samstag 1. Dezember 2007, 20:43
Kontaktdaten:

Unterschied: endif/endfor statt Einrückung, weil das wesentlich weniger verwirrt
Verwirrend?! Im Gegenteil! Verwirrend ist es als Python-Programmierer in Python-nicht-existierende Endmarken zu schreiben und uneingerückten Code zu sehen. Das nenne ich verwirrend! Sollch seltsame Erfindungen sollte man doch bitte unterlassen :-P Wenn man sich nach Endmarken sehnt und das einrücken lästig findet, sollte man vielleicht Ruby programmieren ... :-D

Die Zielgruppe meines Template-Systems (falls es überhaupt eine gibt :-P ) ist die Gruppe der Python-Programmierer und nicht "irgendwelcher Benutzer". Und diese Python-Programmierer lieben es nunmal Python-Code zu schreiben, mit einrücken und ohne Endmarken ... und das kann man bei mir und anderen System halt ... Das finde ich echt mal entspannend und entwirrend :-)
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

THExSYSTEM hat geschrieben:Verwirrend?! Im Gegenteil! *snip*
Ich bezeichne mich als Python Programmierer und finde dennoch Einrückung als Syntaxelement für SGML/XML Dokumente einen Graus. Zumindest so, wie das da oben Implementiert wurde. HAML macht das schon etwas besser, ist aber immer noch nicht brauchbar. Auf der einen Seite weil XML selber kein brauchbares Whitespace Konzept hat und man gerade bei HTML Templates immer wieder mal den einen oder anderen Whitespace zwischen Elementen killen muss, damit es nach was aussieht.

Einrückung ist toll, aber nur, wenn die Syntax das Unterstützt. (SG|X)ML tun das nicht.
TUFKAB – the user formerly known as blackbird
Antworten