Bottle und mod_wsgi

Django, Flask, Bottle, WSGI, CGI…
Antworten
xm22
User
Beiträge: 10
Registriert: Donnerstag 1. Juli 2010, 13:53

Hi,

ich stelle mich bestimmt gerade sehr dämlich an, aber ich kriege es echt nicht hin, bottle mit mod_wsgi zum laufen zu bringen. Hier erst mal, was gegeben ist:

VirtualHost:

Code: Alles auswählen

<VirtualHost *:80>
        ServerName debian.local
        DocumentRoot /var/www/python/
        WSGIDaemonProcess bottle_test user=www-data group=www-data processes=1 threads=5
        WSGIScriptAlias / /var/www/python/bottle_test/app.wsgi
        <Directory /var/www/python/bottle_test>
                WSGIProcessGroup bottle_test
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>
</VirtualHost>
Ordner:

Code: Alles auswählen

/var/www/python
/var/www/python/bottle_test
/var/www/python/bottle_test/app.wsgi
/var/www/python/bottle_test/bottle.py
Apache-Error-Log:

Code: Alles auswählen

[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68] mod_wsgi (pid=11188): Target WSGI script '/var/www/python/bottle_test/app.wsgi' cannot be loaded as Py$
[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68] mod_wsgi (pid=11188): Exception occurred processing WSGI script '/var/www/python/bottle_test/app.wsgi'.
[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68] Traceback (most recent call last):
[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68]   File "/var/www/python/bottle_test/app.wsgi", line 1, in <module>
[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68]     from bottle import route, run
[Mon Jul 05 16:27:36 2010] [error] [client 10.0.60.68] ImportError: No module named bottle
So, wie ich das jetzt verstanden habe, müsste die bottle.py autmatisch gefunden werden oder fehlt mir da noch etwas?
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

xm22 hat geschrieben: So, wie ich das jetzt verstanden habe, müsste die bottle.py autmatisch gefunden werden oder fehlt mir da noch etwas?
mod_wsgi wechselt das Verzeichnis nicht, d.h. /var/www/python/bottle_test ist nicht das aktuelle Verzeichnis und damit auch nicht im Pythonpath. Benutze also die WSGIPythonPath direktive um es hinzuzufügen.
http://www.felix-benner.com
xm22
User
Beiträge: 10
Registriert: Donnerstag 1. Juli 2010, 13:53

Stelle ich mich zu dämlich an?

Jetzt sieht die Konfiguration so aus:

Code: Alles auswählen

WSGIPythonPath /var/www/pythin/bottle_test/

<VirtualHost *:80>
        ServerName debian.local
        DocumentRoot /var/www/python/
        WSGIDaemonProcess bottle_test user=www-data group=www-data processes=1 threads=5
        WSGIScriptAlias / /var/www/python/bottle_test/app.wsgi
        <Directory /var/www/python/bottle_test>
                WSGIProcessGroup bottle_test
                WSGIApplicationGroup %{GLOBAL}
                Order deny,allow
                Allow from all
        </Directory>
</VirtualHost>
Aber das selbe Problem: Er findet bottle nicht..
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wo ist denn die Bottle-Datei?

Und poste mal den app.wsgi.

Gruß, noisefloor
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

xm22 hat geschrieben:

Code: Alles auswählen

WSGIPythonPath /var/www/pythin/bottle_test
Aber das selbe Problem: Er findet bottle nicht..
Du hast einen Tippfehler im Pfad. Außerdem hat das Beispiel in der Bottle Dokumentation folgende Zeilen VOR dem bottle-import:

Code: Alles auswählen

# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))
Damit sollte es auch ohne WSGIPythonPath gehen.
Bottle: Micro Web Framework + Development Blog
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Defnull hat geschrieben:Du hast einen Tippfehler im Pfad. Außerdem hat das Beispiel in der Bottle Dokumentation folgende Zeilen VOR dem bottle-import:

Code: Alles auswählen

# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))
Das klingt nach einer sehr schlechten Idee. Im embedded mode gibt es nur ein working directory fuer allen Code im Server und geht damit leicht kaputt. Ansonsten hast du immer noch das Problem, dass dir irgendwas den Pfad aendern kann. Warum braucht bottle ein gesetztes Working Directory?
TUFKAB – the user formerly known as blackbird
xm22
User
Beiträge: 10
Registriert: Donnerstag 1. Juli 2010, 13:53

Selbst mit dem os-Befehl ändert sich nichts.

Meine app.wsgi:

Code: Alles auswählen

from bottle import route, run

@route('/')
def index():
    return 'Hello World!'
Die Bottle-Datei ist im selben Verzeichnis wie die app.wsgi.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Meine app.wsgi:
Äh... Da fehlt auch was, damit es im Apache unter mod_wsgi läuft...

Schau noch mal in die Doku. :-)

Gruß, noisefloor
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@misuhiko: Bei mir ist es so, dass Bottle die Templates sonst nicht findet. Das Skript an sich läuft, AFAIK... müsste ich aber nochmal testen.

Gruß, noisefloor
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

noisefloor meint hier: http://bottle.paws.de/docs/0.8/tutorial ... e-mod-wsgi

@mitsuhiko, ich habe bottle installiert, also im site-packages Ordner => ich brauche

Code: Alles auswählen

os.chdir(os.path.dirname(__file__))
nicht, nur wenn ich templates verwenden will, da sie sonst wie bei noisefloor nicht gefunden werden.
the more they change the more they stay the same
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

mitsuhiko hat geschrieben:Warum braucht bottle ein gesetztes Working Directory?
Um die Templates zu finden. Wenn es nur um templates geht, kann man das auch mit

Code: Alles auswählen

bottle.TEMPLATE_PATH.append('/path/to/templates')
lösen, aber das Problem des OP ist ja eher, das bottle.py nicht in sys.path zu finden ist.
Bottle: Micro Web Framework + Development Blog
xm22
User
Beiträge: 10
Registriert: Donnerstag 1. Juli 2010, 13:53

Vielleicht habe ich ja Tomaten auf den Augen.. Meine app.wsgi jetzt (Mal trotz des hin und her mit dem os :)):

Code: Alles auswählen

import os
# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))

import bottle
# ... add or import your bottle app code here ...
# Do NOT use bottle.run() with mod_wsgi
application = bottle.default_app()
os musste ich importieren, da es sonst nicht gefunden wurde. Die Path-Direktive habe ich wieder aus der Apache-Config entfernt.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zum Thema Working Dir ändern, würde ich auch nicht machen. Sobald man mehrere WSGI-Container hat, läuft das Ganze nicht mehr wie gewünscht.
Meine Lösung:

Code: Alles auswählen

APP_ROOT = os.path.abspath(os.path.dirname(__file__))
bottle.TEMPLATE_PATH.append(os.path.join(APP_ROOT, 'views'))
Analog kannst du auch bei deinem Problem vorgehen, ich würde das so lösen (statt dem Teil mit `os.chdir`):

Code: Alles auswählen

import os
import sys
APP_ROOT = os.path.abspath(os.path.dirname(__file__))
sys.path.insert(0, APP_ROOT)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@ms4py: Was meinst du mit "mehrere Container" - mehrere WSGI-Apps in verschiedenen Verzeichnissen auf einem Apache?

Das funktioniert bei mir ohne Probleme (bei drei Apps in drei Verzeichnissen und 3x mal dem "falschen" adapter.wsgi, wie oben beschrieben).

Gruß, noisefloor
xm22
User
Beiträge: 10
Registriert: Donnerstag 1. Juli 2010, 13:53

@ms4py: Danke, das hat funktioniert. Jetzt muss ich nur noch mit dem Framework klar kommen :)

Allen anderen auch vielen Dank für die Mühe!
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

noisefloor hat geschrieben:Das funktioniert bei mir ohne Probleme (bei drei Apps in drei Verzeichnissen und 3x mal dem "falschen" adapter.wsgi, wie oben beschrieben).
Aber nicht mit einem relativen Template-Pfad...
(Kommt vielleicht auch auf die spezifische Server-Config an, bei pyrox war es auf jeden Fall ein Problem)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten