4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Grundlagen Web<br />
Templat<strong>in</strong>g<br />
Grundlagen Web<br />
Templat<strong>in</strong>g<br />
Templat<strong>in</strong>g mit Python<br />
E<strong>in</strong>fachst-Templat<strong>in</strong>g e<strong>in</strong>gebaut<br />
• Python Formatier-Operator %<br />
• Ersetzungsstelle <strong>in</strong> template durch<br />
%(name)s markieren<br />
• In Ersetzungs-Dictionary<br />
dic["name"] = wert setzen<br />
• Für mehrere Stellen und mehrere<br />
Name/Wert-Paare<br />
• E<strong>in</strong>setzen mit template % dic<br />
Template-Eng<strong>in</strong>es<br />
• Reichlich vorhanden, e<strong>in</strong> paar<br />
Dutzende <strong>in</strong><br />
http://wiki.python.org/mo<strong>in</strong>/Templat<strong>in</strong>g<br />
• Mehr Features, zum Beispiel Iterieren<br />
• Uns reicht E<strong>in</strong>fachst-Templat<strong>in</strong>g<br />
tpage.tpl<br />
1 <br />
2 %(title)s<br />
3 <br />
4 %(title)s<br />
5 %(tablecontent)s<br />
6 <br />
7 <br />
tabl<strong>in</strong>e.tpl<br />
1 <br />
2 %(first)s<br />
3 %(second)s<br />
4 <br />
Templat<strong>in</strong>g mit Python – Beispiel<br />
Beispiel<br />
• Template-Dateien vollständig e<strong>in</strong>lesen<br />
• Ersetze z.B. title durch Zeichen, zwei<br />
Mal, im Header und am Anfang der<br />
Seite<br />
• Typische letzte Zeile, vorher nie e<strong>in</strong>e<br />
Ausgabe<br />
tplzeichen.cgi<br />
1 #!/usr/b<strong>in</strong>/python<br />
2 pr<strong>in</strong>t "Content-Type: text/html\n"<br />
3 import cgi, cgitb, str<strong>in</strong>g<br />
4 cgitb.enable()<br />
5<br />
6 tabl<strong>in</strong>e = file("tabl<strong>in</strong>e.tpl").read()<br />
7 page = file("tpage.tpl").read()<br />
8<br />
9 l<strong>in</strong>es = []<br />
10 for c <strong>in</strong> str<strong>in</strong>g.lowercase:<br />
11 dic = {’first’ : c,<br />
12 ’second’ : c.upper()}<br />
13 l<strong>in</strong>es.append(tabl<strong>in</strong>e%dic)<br />
14<br />
15 dic = {’title’: "Zeichen"}<br />
16 dic[’tablecontent’] = "\n".jo<strong>in</strong>(l<strong>in</strong>es)<br />
17<br />
18 pr<strong>in</strong>t page % dic<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 29 / 91<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 30 / 91<br />
Grundlagen Web<br />
Templat<strong>in</strong>g<br />
Grundlagen Web<br />
Templat<strong>in</strong>g<br />
Sichere Integration von Inhalten<br />
Komponenten zur Ansicht<br />
Korrekte/sichere Darstellung von Texten<br />
• Spezielle Regeln für Markup (HTML)<br />
müssen e<strong>in</strong>gehalten werden (Aufgabe<br />
des Template-Autors)<br />
• Benutzerdef<strong>in</strong>ierte Inhalte (potenziell<br />
böse) müssen <strong>in</strong>tegriert werden<br />
Probleme – böse Inhalte<br />
• Browserland ist Fe<strong>in</strong>desland<br />
• Texte mit Sonderzeichen/Tags<br />
Vorgefertigte Funktionen verwenden<br />
• Beispiel “Quotieren” von Str<strong>in</strong>gs mit<br />
cgi.escape, Sonderzeichen und<br />
Tag-Zeichen () umwandeln<br />
• E<strong>in</strong>fügen von Skript-Code verh<strong>in</strong>dert<br />
• Weiteres: Entfernen von Tags, . . .<br />
1 #!/usr/b<strong>in</strong>/python<br />
2 # -*- cod<strong>in</strong>g: utf-8 -*-<br />
3 pr<strong>in</strong>t "Content-Type: text/html\n"<br />
4 import os, cgi<br />
5 l<strong>in</strong>es = ["Hallo", "Hällo", "", " bold ", ’a " double quote’]<br />
6 for l<strong>in</strong>e <strong>in</strong> l<strong>in</strong>es:<br />
7 pr<strong>in</strong>t "%s " % l<strong>in</strong>e<br />
8 pr<strong>in</strong>t<br />
9 for l<strong>in</strong>e <strong>in</strong> l<strong>in</strong>es:<br />
10 pr<strong>in</strong>t "%s " % cgi.escape(l<strong>in</strong>e, True)<br />
Hallo <br />
Hällo <br />
<br />
bold <br />
a " double quote <br />
Hallo <br />
Hällo <br />
<tag> <br />
<b> bold </b> <br />
a " double quote <br />
Rendern von HTML beschränken<br />
• Manuelles Generieren von HTML<br />
unabhängig von Präsentationslogik<br />
• Re<strong>in</strong>es Rendern (Generieren) von<br />
HTML unabhängig, wiederverwendbar<br />
realisieren<br />
Beispiel – Tabelle<br />
1 #!/usr/b<strong>in</strong>/python<br />
2 pr<strong>in</strong>t "Content-Type: text/html\n"<br />
3 import cgi, cgitb, str<strong>in</strong>g<br />
4 cgitb.enable()<br />
5<br />
6 from tabelle import table<br />
7<br />
8 V,N,M = ’vorname’,’nachname’,’matnr’<br />
9 keys = [(V, ’Vorname’), (N, ’Nachname’), (M, ’MatNr’)]<br />
10 data = [{V: ’Susi’, N: ’S<strong>in</strong>nlos’, M: ’135789’},<br />
11 {V: ’Rudi’, N: ’Ratlos’, M: ’222333’},<br />
12 {V: ’WWW’, N: ’WickedWestWitch’, M: ’666666’}]<br />
13 ctable = table(keys, data)<br />
14 c = "Tabelle%s" % ctable<br />
15 pr<strong>in</strong>t c<br />
1 # Markup nur konstant, auslagerbar/aenderbar<br />
2 _table = "\n%(header)s\n%(data)s\n\n"<br />
3 _row = "%s"<br />
4 _header = "%s"<br />
5 _entry = "%s"<br />
6<br />
7 def _rowformat(l<strong>in</strong>e, keys, wrap):<br />
8 entries = [wrap % l<strong>in</strong>e[t[0]] for t <strong>in</strong> keys]<br />
9 return _row % " ".jo<strong>in</strong>(entries)<br />
10<br />
11 def table(keys, data):<br />
12 dic = dict()<br />
13 hdict = {}<br />
14 for tup <strong>in</strong> keys:<br />
15 hdict[tup[0]] = tup[1]<br />
16 dic["header"] = _rowformat(hdict, keys, _header)<br />
17 rows = [_rowformat(l<strong>in</strong>e, keys, _entry)<br />
18 for l<strong>in</strong>e <strong>in</strong> data]<br />
19 dic["data"] = "\n".jo<strong>in</strong>(rows)<br />
20 return _table % dic<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 31 / 91<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Web-basierte Anwendungen 24. April 2013 32 / 91