Seite 1 von 1
CherryPy- Anfängerproblem...
Verfasst: Dienstag 3. Februar 2009, 14:52
von Lonestar
Malzeit - Ich beschäftige mich momentan ein wenig mit dynamischen Webseiten. Habe die letzten 2 Monate mal ein wenig mit PHP herumexperientiert - da ich aber letzen Sommer Python kennengelernt habe macht PHP wirklich keinen Spass...
Nachdem ich ein wenig hier im Forum und im sontigen Netz gestöbert habe habe ich letztes Wochenende mal nach der
Anleitung von Gerold cherrypy und vorerst als Templateengine Cheetah bei mir installiert. Nach der Anleitung lief es echt super - und ich bin immer noch begeistert wie einfach man dynamisch Webseiten erstellen kann.
Nun mal langsam zu meinem Problem. Die beispiele auf der Seite von Gerold benutzen ja alle noch einen eigenen Server - ich möchte das ganze aber schon hinter meinem Apache laufen lassen. Nach einigem suchen habe ich mir
modwsgi installiert. Das
hello world - Beispiel auf der Seite habe ich auch ans laufen gebracht. Nur sobald ich ein Template einbinden will bekomme ich vom Server die Fehlermeldung:
500 Internal Server Error
The server encountered an unexpected condition which prevented it from fulfilling the request.
Ich zeig mal kurz meinen Beispielcode:
Code: Alles auswählen
import sys
sys.stdout = sys.stderr
from Cheetah.Template import Template
import atexit
import threading
import cherrypy
import os
APPDIR = os.path.dirname(os.path.abspath(__file__))
INI_FILENAME = os.path.join(APPDIR, "cptest.ini")
cherrypy.config.update({'environment': 'embedded'})
class Root(object):
def index(self):
return 'Hello World!'
index.exposed = True
def templatetest(self):
filename = os.path.join(APPDIR, "index.tmpl")
template = Template(file = filename)
template.content = "Dieser Text wurde von CherryPy ersetzt."
return str(template)
templatetest.exposed = True
application = cherrypy.Application(Root(), None)
Das ist der von
http://code.google.com/p/modwsgi/wiki/I ... thCherryPy übernommen Beispielcode. Lediglich erweitert um meine Methode templatetest. Wenn ich die Zeilen ab
template = Template(file = filename)
auskommentiere und einen anderen Rückgabewert eingebe kann ich auch diese Methode sauber aufrufen. Der Aufruf mit Templates hatte vorher bei meinen Veruchen nach den Beispielen von Gerold wunderbar funktioniert.
Wahrscheinlich würde ich den Fehler schon irgendwann selber finden wenn ich wüsste wie ich einen traceback bekomme.
Aber vielleicht sieht auch jemand von euch schon einen dicken Fehler den ich mache?
Verfasst: Dienstag 3. Februar 2009, 15:28
von gerold
Hallo Lonestar!
Ich habe mod_wsgi noch nicht ausprobiert, deshalb kann ich dir keine fundierten Tipps geben.
Vielleicht probierst du es aber mal mit
http://code.google.com/p/modwsgi/wiki/Q ... y_Problems.
Und lass dir doch mal den zusammengesetzten Pfad zur TMPL-Datei ausgeben. Vielleicht stimmt dieser nicht.
Ich weiß nicht, ob es hilft, aber vielleicht kannst du zusätzliche Debug-Informationen mit dieser Zeile bekommen:
Und wir sprechen hier von Windows, richtig? Welcher Apache, welche Python-Version, welches CherryPy, welches Cheetah? Und wie hast du den Apachen konfiguriert?
Vielleicht kann der Apache die TMPL-Datei nur nicht lesen? Läuft der Apache vielleicht unter einem anderen Benutzer? Hat dieser Benutzer das Leserecht auf die TMPL-Datei? Probiere mal die Datei im Beispiel mit "open" einzulesen und als Text auszugeben, ohne diesen von Cheetah rendern zu lassen.
mfg
Gerold

Verfasst: Dienstag 3. Februar 2009, 16:13
von Lonestar
Hi Gerold - erst noch mal ein Lob für dein Tutorial auf deiner Seite - das hat mir echt gut gefallen
OK, dann noch schnell meine vergessenen Systemdaten:
OS- WIN XP (hast du schon richtig vermutet)
meinen Apache habe ich vor nem Jahr oder so mal mit EasyPHP installiert - Apache version 2.2.3
Python 2.5.2
CherryPy version 3.3.1
Cheetah verion 2.0.1
bei deiner Frage wie ich meinen Apache konfiguriert habe bin ich leicht überfordert... ich habe mich halt an
diese Anleitung gehalten. Dabei rausgekommen ist das ich in die httpd.conf von meiner EasyPHP-Installation ein Alias hinzugefügt habe das so ausschaut:
Code: Alles auswählen
WSGIScriptAlias "/liq" "E:/CherryPyTest/cptest.py"
<Directory e:/CherryPyTest>
Options FollowSymLinks Indexes
AllowOverride None
Order deny,allow
Allow from all
</Directory>
Ich vermute das ist nicht die geschickteste Variante wie ich das eingebunden habe... Verbesserungsvorschläge nehme ich gerne entgegen
Dein Link - auf die Projektseite (auf der ich schon mehrmals heute war) war übrigens Gold wert. Manchmal sieht man ja den Wald vor lauter Bäumen nicht. Ich habe mal das logfile vom Apachte geöffnet. Scheint so als hätte ich das(ein) Problem gefunden.
[Tue Feb 03 15:53:31 2009] [notice] Child 3104: Starting thread to listen on port 80.
[Tue Feb 03 15:53:57 2009] [error] E:\\Programme\\Python2_5\\lib\\site-packages\\cheetah-2.0.1-py2.5.egg\\Cheetah\\Compiler.py:1532: UserWarning:
[Tue Feb 03 15:53:57 2009] [error] You don't have the C version of NameMapper installed! I'm disabling Cheetah's useStackFrames option as it is painfully slow with the Python version of NameMapper. You should get a copy of Cheetah with the compiled C version of NameMapper.
[Tue Feb 03 15:53:57 2009] [error] "\\nYou don't have the C version of NameMapper installed! "
also werde ich mal nach der passenden Cheetah-Version suchen müssen -korrekt?
Ich mach mich schon mal ein wenig auf die Suche...
[edit]
ach so - ja der Pfad zum template stimmt - den kann ich mir ausgeben lassen. Auch das template hat schon funktioniert
[/edit]
Edit by Gerold: Quote-Tag gesetzt, dass das Fenster nicht so breit wird.
Verfasst: Dienstag 3. Februar 2009, 17:05
von gerold
Lonestar hat geschrieben:also werde ich mal nach der passenden Cheetah-Version suchen müssen -korrekt?
Hallo Lonestar!
Nein, du hast schon die korrekte Cheetah-Version. Nur den Namemapper hast du nicht installiert -- und das ist überhaupt kein Problem. Cheetah läuft auch ohne den beschleunigten Namemapper.
Ich glaube, du musst nach einem anderen Fehler suchen.
mfg
Gerold

Verfasst: Dienstag 3. Februar 2009, 17:40
von Lonestar
Ok - das erste größere Problem scheint behoben - nachdem ich den Namemapper installiert habe von
http://www.cheetahtemplate.org/download.html kann ich meine Templates ausliefern lassen -mich wunderts nur das das vorher noch kein Problem war, denn schliesslich liefs ja mit dem CherryPy eigenem Server auf Port 8080 auch.
Das nächste Problem ist aber auch schon postwendend aufgetreten. Ich importiere in meinem Template ein anderes Template - das liegt im gleichen Verzeichnis wie das momentan verwendete. Eingebunden wird es momentan im template mittels:
Aber Python möchte das unbedingt aus :
'C:\\Dokumente und Einstellungen\\waschtl_1\\menu_left.tpl'
importieren - das ist mein Home- Verzeichnis unter Win XP. Allerdings liegt das Script das gerade ausgeführt wird, sowie auch die Templates -wie man übrigens auch oben bei der Konfiguration vom Apache sehen kann unter:
'E:/CherryPyTest/'
Nehme ich alle Verweise auf abhängige Dateien Raus - dann fluppt das ganze schon fast so wie ich mir das dachte. Liegt das evtl daran wie MOD_WSCGI Python startet? Ich meine mein Home-Verzeichnis wird ja sicher nicht nur zufällig benutzt oder?
Verfasst: Dienstag 3. Februar 2009, 18:07
von gerold
Hallo Lonestar!
Ich habe mich ein wenig gespielt. Mit diesen Einstellungen solltest du bessere Fehlermeldungen bekommen. Und im Apache-Errorlog sollte ebenfalls genug stehen, um Probleme besser beheben zu können:
Code: Alles auswählen
import sys
sys.stdout = sys.stderr
import os
import cherrypy
from Cheetah.Template import Template
APPDIR = os.path.dirname(os.path.abspath(__file__))
class Root(object):
def index(self):
return APPDIR
index.exposed = True
def templatetest(self):
filename = os.path.join(APPDIR, "index.tmpl")
template = Template(file = filename)
template.content = "Dieser Text wurde von CherryPy ersetzt."
return str(template)
templatetest.exposed = True
cherrypy.config.update(
{
'environment': 'embedded',
'engine.autoreload_on': True,
'tools.log_headers.on': True,
'request.show_tracebacks': True,
'log.screen': True,
}
)
application = cherrypy.Application(Root(), None)
mfg
Gerold

Verfasst: Dienstag 3. Februar 2009, 18:29
von gerold
Verfasst: Dienstag 3. Februar 2009, 21:01
von Lonestar
wow - so klappts

Den Pfad für die Templates einfach zu übergeben - das ich da nich drauf gekommen bin.
Aber da geht meine Fragerei auch schon weiter - irgendwie werde ich mit der Doku zu CherryPy nicht so richtig warm. Eigentlich würde ich gerne eine Configdatei benutzen - alleine schon um ein paar static directorys zu basteln. In deinem jetzigem Beispiel hast du die Konfiguration ja direkt in Python gemacht. Auf deiner Homepage machst du das mit dem ini-File. Letzteres gefällt mir persönlich am besten. Aber ich finde nur Beispiele für eine ini-Datei in Verbindung mir der Methode 'cherrypy.quickstart'. Die liefert mir aber nun mal nich mein application-Objekt für MOD_WSCGI. Ich hab einiges ausprobiert... nichts will wirklich funktionieren. Auch wenn ich wie in den Beispielen auf
http://www.cherrypy.org/wiki/StaticContent oder auf
http://www.cherrypy.org/wiki/ConfigAPI meinen Static Ordner für css- Dateien erstellen will klappt das nicht - Wahrscheinlich weil ich das falsch mache:
Code: Alles auswählen
cherrypy.config.update(
{
'/css':
{
"tools.staticdir.on" : True,
"tools.staticdir.dir" : "css"
}
}
)
Zumindest bekomme ich immer einen 404 Zugriffsfehler wenn ich versuche auf meine css-Datei im static dir zuzugreifen...
Gibts evtl nen Teil der Doku den ich übersehen habe? Vermutlich habe ich heute einfach viel zu lange versucht das ans laufen zu bringen... ich werd gleich mal Feierabend machen und das morgen noch mal in Ruhe anzugehen
bis hierhin noch einem vielen Dank für die Hilfestellung
Sebastian
Verfasst: Dienstag 3. Februar 2009, 21:40
von gerold
Lonestar hat geschrieben:Eigentlich würde ich gerne eine Configdatei benutzen
Hallo Sebastian!
Du kannst an ``cherrypy.config.update`` statt dem Dictionary den Dateinamen zur INI-Datei übergeben.
mfg
Gerold

Verfasst: Mittwoch 4. Februar 2009, 08:11
von gerold
Lonestar hat geschrieben:Static Ordner für css- Dateien erstellen
Hallo!
http://paste.pocoo.org/show/102712/
oder so:
Code: Alles auswählen
application = cherrypy.Application(Root(), config = "<Pfad zur INI>")
mfg
Gerold

Verfasst: Mittwoch 4. Februar 2009, 10:40
von Lonestar
Juten Morgen - wenn man mal ne Nacht drüber schläft geht das auch viel flüssiger weider von der Hand

ich habe vorhin mal deine Beispiele ausprobiert.
Code: Alles auswählen
application = cherrypy.Application(Root(), config = "<Pfad zur INI>")
das funktioniert bei mir nicht ganz. In der
Doku steht aber das nach dem Root erst noch die URL zum Root angegeben werden muss - wenn ich die None setze kann ich danach meine Config angeben und es läuft
Code: Alles auswählen
application = cherrypy.Application(Test(), None, config = INI_FILENAME)
So wie es aussieht funktioniert nun alles wie ich mir das vorgestellt habe. Ich habe ein statisches Verzeichnis für Bilder (images) und eines für CSS-Dateien (css) angelegt. Die enthaltenen Dateien werden ausgeliefert - und auch in meinen Templates wunderbar benutzt. Von daher würde ich vermuten das ich CherryPy soweit richtig eingestellt habe.
Was ich jetzt noch zu bemängeln habe scheint nicht wirklich noch etwas mit CherryPy zu tun zu haben. Im error.log vom Apache bekomme ich nach jedem Seitenaufruf Fehlermeldungen die folgendermaßen aussehen:
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/ HTTP/1.1" 200 2609 "" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/css/main.css HTTP/1.1" 304 - "
http://localhost/liq/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/images/logo_top.jpg HTTP/1.1" 304 - "
http://localhost/liq/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
Das ist ein Aufruf vom Root - das bei mir auf dem Server mit '
http://localhost/liq/' aufgerufen wird. Die beiden Dateien die bemängelt werden werden aber ausgeliefert und werden auch auf der Seite verwendet. Wenn ich die Dateien direkt aufrufe gibt es keine Meldung im error.log. Kann ich das einfach so laufen lassen oder (das vermute ich mal ganz stark) mache ich noch irgendwas bei der Configuration vom Apache falsch?
EDIT by Gerold: Quote-Tag gesetzt, damit die Seite nicht so auseinandergezogen wird.
Verfasst: Mittwoch 4. Februar 2009, 11:16
von gerold
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/ HTTP/1.1" 200 2609 "" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/css/main.css HTTP/1.1" 304 - "
http://localhost/liq/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
[Wed Feb 04 10:30:24 2009] [error] 127.0.0.1 - - [04/Feb/2009:10:30:24] "GET /liq/images/logo_top.jpg HTTP/1.1" 304 - "
http://localhost/liq/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.20) Gecko/20081217 Firefox/2.0.0.20"
Hallo!
Also der Statuscode 304 steht für "Not Modified". Es handelt sich hiermit also um einen Hinweis, dass die Datei nicht verändert wurde und somit aus dem Cache geladen werden kann.
Für 200 muss ich nachsehen...
...Moment mal. 200 ist doch "OK". Warum ist das dann ein Fehler?
...nachdenken muss.
EDIT: Es könnte irgendetwas mit diesen Anweisungen zu tun haben:
Code: Alles auswählen
# entweder damit...
import sys
sys.stdout = sys.stderr
# oder damit... (in Kombination mit ``sys.stdout = sys.stderr``)
cherrypy.config.update(
{
'tools.log_headers.on': True, # <--
'log.screen': True, # <--
}
)
Bitte selber ausprobieren.
mfg
Gerold

Verfasst: Mittwoch 4. Februar 2009, 13:26
von Lonestar
Es Läuft

- hat zwar ein wenig länger gedauert als ein 08-15 EasyPHP aufzusetzen, aber das kann ja heutzutage jeder

Das Problem gelöst hat bei mir log.screen auf False zu setzen. Ich habe das auch in meiner ini- Datei erledigt mit dem Eintrag:
Ohne deine Hilfe hätte ich die nötigen Einstellungen wohl nie hinbekommen. Bin ich der einzige der mit der Doku etwas auf Kriegsfuß steht? Mittlerweile habe ich einige Teile der Doku und des Wikis mehrmals überflogen und es sind doch schon manche Sachen hängengeblieben wie der Aufruf von 'cherrypy.Application()' oder ähnliches... aber gibt es evtl noch ne andere Anlaufstelle als die Projekthomepage?
Ich werde nu erst mal heute Abend eine Runde experimentieren was man noch so alles machen kann. Nu wo die Unklarheiten beseitigt sind fängts erst an richtig Spass zu machen
Verfasst: Mittwoch 4. Februar 2009, 15:51
von Achanjiati
Ich kann dich da sehr gut verstehen Lonestar, gerade die Abteilung mit den statischen Inhalten hat mir damals ein wenig Kopfzerbrechen bereitet weil mich das dort beschriebene damals etwas verwirrte. Also daher: Nein, bist nicht der einzige
