CherryPy- Anfängerproblem...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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:

Code: Alles auswählen

import cgitb; cgitb.enable()
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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Hi Gerold - erst noch mal ein Lob für dein Tutorial auf deiner Seite - das hat mir echt gut gefallen :D

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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

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:

Code: Alles auswählen

#include "menu_left.tpl"
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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
Zuletzt geändert von gerold am Mittwoch 4. Februar 2009, 08:12, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Juten Morgen - wenn man mal ne Nacht drüber schläft geht das auch viel flüssiger weider von der Hand :roll: 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.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

[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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Es Läuft :D - 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:

Code: Alles auswählen

[global]
log.screen = False
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
Benutzeravatar
Achanjiati
User
Beiträge: 1
Registriert: Mittwoch 21. Januar 2009, 14:49

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 ;)
Antworten