deamon hat geschrieben:CherryPy gefällt mir zwar wegen seiner Einfachheit und Kompaktheit, aber die Doku finde ich grausam und wenn man vom Standardschema abweichende URLs haben möchte, hört es auch einfach zu sein.
Hallo Christian!
Was die Dokumentation von CherryPy betrifft: Ich bin recht gut damit gefahren, mir alle Seiten der CherryPy-Website auszudrucken und durchzulesen. Die wichtigsten Dinge werden auf jeden Fall erklärt. Weiters habe ich noch dieses Buch
http://www.cherrypyessentials.com/ gelesen. Dort steht der Rest drinnen, den man noch wissen muss.
Aber eigentlich ist CherryPy recht einfach aufgebaut. Es gibt eine Request-Objekt (``cherrypy.request``) über das man alles erfahren kann, was so vom Browser an Informationen rüber kommen. Ich habe mir dazu eine kleine Funktion geschrieben, die mir anzeigt, was ich alles so an Informationen bekomme:
Code: Alles auswählen
def show_request(self):
"""
Zeigt die Attribute des Requests als Text an.
"""
from pprint import pformat
retstr = "<pre>"
for key, value in cherrypy.request.__dict__.items():
retstr += "%s: %s\n\n" % (key, pformat(value).replace("\\n", "\n"))
retstr += "</pre>"
return retstr
Sehr nützlich das Ding!
Bei jedem Request eines Browsers wird dieser an eine Funktion weitergeleitet. Über *args und **kwargs bekommt man den Pfad und die übermittelten Parameter übergeben. Die Rückgabe dieser Funktion, wird dann direkt als Response an den Browser zurück gesendet. Der einfachheit halber, wird das Ganze als Content-Typ "text/html" übermittelt. Möchte man stattdessen einen anderen Content-Typ zurück liefern, dann kann man den Content-Typ selber ändern.
Der Response kann angepasst werden, bevor dieser an den Browser zurück gesendet wird. Der Response ist genau so ein Objekt wie der Request. Der Response ist in CherryPy über ``cherrypy.response`` ansprechbar.
Genau so wie es eine Request-Objekt und ein Response-Objekt gibt, gibt es auch ein Session-Objekt (``cherrypy.session``). Dabei handelt es sich um ein Dictionary-ähnliches Objekt, an welches man Objekte binden kann. Objekte, die für eine Session lang gültig sind. Man kann die Session so einstellen, dass diese im Dateisystem als Pickle oder in einer Datenbank abgelegt wird.
Wenn man mit Datenbanken arbeitet, dann ist noch recht fein, dass man ein threadsicheres Objekt (``cherrypy.thread_data``) zur Verfügung hat, an welches man Objekte/Daten binden kann, die immer nur für den aktuellen Thread gültig sind. So kann man je eine Connection für je einen Thread vorhalten. Das sind dann in der Standardeinstellungen neun Thread mit je einer eigenen Connection.
Die Einstellungen können in einer INI-Datei gehalten werden. Man greift über ``cherrypy.config`` darauf zu. Das kann man z.B. nutzen um die Datenbankeinstellungen auszulagern.
Über die INI-Datei kann man z.B. einstellen, dass CherryPy immer nur UTF-8 zurück liefert. Dafür muss man sich nur darum kümmern, dass man beim "return" der jeweiligen Handler-Funktionen Unicode zurück gibt. CherryPy kümmert sich um den Rest.
Weiters kann man CherryPy so einstellen, dass man beim Request Unicode (z.B. von HTML-Formularen) zurück bekommt. Man kann sich dann einfach darauf verlassen, dass man es in der Handler Funktion immer nur mit Unicode zu tun hat. Dieses Verhalten wird seit der neuen Version auch von Cheetah, der Python-ähnlichen Vorlagensprache, unterstützt.
Ich glaube, das schreibe ich so auch in meine Website.
mfg
Gerold
PS: Gesagt, getan -->
http://halvar.at/python/ein_paar_worte_ueber_cherrypy/
PS2: Das mit den "komplizierteren" URLs ist auch nicht so schwer:
http://www.python-forum.de/post-132770.html#132770
.