Danipol,
mir ist unverständlich, warum Leute immer CGI-Anwendungen schreiben wollen, das ist mit das Umständlichste und Primitivste wo geht.
Django wäre eine Alternative genau wie eine weitere Reihe von Web-Rahmenwerken, die da sind, um dir die Sache einfacher zu machen.
Beim Thema DB höre auf niemanden außer mir und nimm
sqlite. Das ist bei Python eingebaut und sollte für die Aufgabe, eine Liste von Texten zu speichern, absolut ausreichend sein. Ich sehe aber auch nicht, warum pickle nicht gehen sollte - gerade wenn die Daten nun mal in diesem Format vorliegen.
Entscheidend ist aber (mal wieder), den Unterschied zwischen Bytes und Zeichen, sprich `str` und `unicode`, zu verstehen. Ich wundere mich immer wieder, warum das keiner rafft.
Daher: Lass die Coding-Zeilen weg. Die bringen gar nichts. htmlentitydefs brauchst du auch keine. Und HTML-Processing-Instructions helfen dir auch nicht weiter.
Du musst stattdessen wissen, dass HTTP ein auf Bytes basierendes Protokoll ist. Wenn du Zeichen übertragen willst, musst du sie kodieren. Dies nennen man ein Encoding. Eine Seite im text/html-Format wird von einem Browser als ISO-8859-1 kodiert interpretiert, wenn kein anderes Encoding angegeben ist. Für den Header gilt dies immer. Gib aber lieber explizit das Encoding für den Body an und nimm hier UTF-8.
Benutze in deiner Anwendung ausschließlich Zeichen, also Unicode-Strings. Du hast offenbar Python 2.6, also musst du den Datentyp `unicode` und ich `str` benutzen.
Verzichte in einer CGI-Anwendung auf `print`. Denn das kodiert Zeichen bei der Ausgabe wieder zu Bytes, die dann dein Terminal versteht. Unter Windows könnte dies CP1252 sein, muss aber nicht. Du könntest das richtige Encoding es setzen, ist aber aufwendig und alles recht schleierhaft. Mach es explizit! Beachte auch, dass `print` unter Windows aus allen `\n` jeweils `\r\n` macht. Das wäre zwar für HTTP genau richtig, denn dort muss das Zeilenende aus CR und LF bestehen, doch auch hier gilt: Explizit statt implizit. Daher...
Code: Alles auswählen
import sys
def emit(s):
sys.stdout.write(s.encode("utf-8"))
with open("quotes.dat", "rb") as f:
quotes = pickle.load(f) # auch dies sollten unicode-Objekte sein, keine str-Objkte!
emit(u"Content-type: text/html;charset=utf-8\r\n\r\n")
emit(u"<html><body><h1>Zitate</h1><ul>")
for quote in quotes:
emit(u"<li>%s</li>" % quote)
emit(u"</ul></body></html>")
Stefan