31.10.2013 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 />

&lt;tag&gt; <br />

&lt;b&gt; bold &lt;/b&gt; <br />

a &quot; 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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!