OVH Community, your new community space.

[Tutorial] web.py Einrichten


Julian
08.02.14, 15:13
Ich dachte mich ich schreibe meine Erfahrungen einfach mal nieder für die, die ähnliches vorhaben. Hier also ein kurzes Tutorial um das web.py Framework auf einem OVH Webhosting Paket zu installieren:
Verwendete Versionen:
web.py 0.37 von http://webpy.org/install
flup 1.02 von https://pypi.python.org/pypi/flup
Beide Libraries müssen als tar.gz Archiv lokal heruntergeladen werden (lässt sich unter Windows z.B. mit 7zip entpacken)

1. Verzeichnisstruktur und Libs
Ich habe meine Libraries ungern im Documents Root (oder einem Unterordner davon). Deshalb habe ich im FTP Hauptverzeichnis den Unterordner python-lib angelegt. In diesen Ordner muss nun der "web" (nicht web.py-0.37) Ordner aus der web.py-0.37.tar.gz und der Ordner "flup" (nicht flup-1.0.2) aus der flup-1.0.2.tar.gz hochgeladen werden. Die anderen Dateien und Unterordner (egg, setup.py etc...) werden nicht benötigt.
Das Ganze sollte nun so aussehen (Unterordner von web und flup wurden der Übersicht halber weg gelassen)
/ [ftp home]
-- /python-lib
----/python-lib/web
----/python-lib/flup
--/www

Nun muss der Absolute Pfad gefunden werden. Dieser steht z.B. im OVH Manager unter Zusammenfassung -> Persönlicher Ordner. Im Weiteren wird dieser als "/homea.123/user" angenommen und muss natürlich angepasst werden.

2. .htaccess
Um Skripte mit der Endung .py ausführen zu können müssen folgende Zeilen in der .htaccess im /www Ordner eingefügt werden (ggf. Erstellen wenn nicht vorhanden)
Code:
Options +ExecCGI
AddHandler cgi-script .py
Alternativ kann das Skript mit der Endung .cgi abgespeichert werden, dann ist die .htaccess nicht nötigt

2. Erster Test
Im www Ordner wird nun die Datei test.py (Rechte: 705) mit folgendem Inhalt erstellt:
Code:
#!/usr/bin/env python

#setup lib path
import sys
sys.path.append('/homea.123/user/python-lib') #ANPASSEN!

#load web.py
import web

urls = (
    '/', 'index'
)

class index:
    def GET(self):
        return "Hello, world!"

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()
WICHTIG: Die Datei muss mit Linux Zeilenende Codiert werden!
Nun kann das Skript aufgerufen werden über http://meine.tld/test.py/ (Domainname natürlich anpassen. Wichtig: der Backslash am Ende ist KEIN Fehler sondern wird benötigt!)
Die Meldung "Hello, world!" sollte erscheinen. Web.py ist nun verwendbar !

3. Debugging
Vor allem in der Entwicklungsphase ist es sinnvoll Debugging-Output zu aktivieren. Hier gibt es zwei unahängige Error Handler:
1. Der normale Python Error Handler (bei Fehler in den verwendeten Libs)
2. Der web.py Error Handler (bei Fehlern im Webseitencode)
Diese lassen sich unabhängig voneinander konfigurieren.
Für 1. wird der Code aus 2. etwas erweitert:
Code:
#!/usr/bin/env python

#setup lib path
import sys
sys.path.append('/homea.123/user/python-lib') #ANPASSEN!

#load web.py
import web

# enable debugging
import cgitb
cgitb.enable()

import nonexistant #does not exist

urls = (
    '/', 'index'
)

class index:
    def GET(self):
        return "Hello, world!"

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()
Wird das Skript nun aufgerufen sollte die Fehlmeldung "" erscheinen, da das Modul "nonexistant" nicht existiert. Wird die Zeile cgitb.enable() auskommentiert oder gelöscht, erscheint der Standard Error 500 des Webservers.

Für 2. wird der Code wieder etwas abgewandelt:
Code:
#!/usr/bin/env python

#setup lib path
import sys
sys.path.append('/homea.123/user/python-lib') #ANPASSEN!

#load web.py
import web

# enable debugging
import cgitb
cgitb.enable()

def cgidebugerror():   
    _wrappedstdout = sys.stdout
    sys.stdout = web._oldstdout
    cgitb.handler()
    sys.stdout = _wrappedstdout
web.internalerror = cgidebugerror
web.config.debug = True

urls = (
    '/', 'index',
    '/dbgtest', 'dbgtest'
)

class index:
    def GET(self):
        return "Hello, world!"

class dbgtest:
    def GET(self):
        raise NameError('Debug Output Test')

if __name__ == "__main__":
    app = web.application(urls, globals())
    app.run()
Wird nun das Skript über http://meine.tld/test.py/dbgtest aufgerufen Erschient die Debugging Ausgabe von web.py. Wird die Zeile web.config.debug = True in web.config.debug = False abgeändert, gelöscht oder auskommentiert (False ist der default Wert wenn das Script auf einem echten Webserver läuft) erscheint die "internal error" Meldung von web.py ohne Debugging Ausgabe.

Viel Spaß Damit
Julian