WSGI Anwendungen

Eine WSGI Anwendung ist sehr einfach gestrickt. Aus diesem Grund ist die Entwicklung nicht ganz so trivial wie ein direkter mod_python-Zugriff, dafür ist die Anwendung portabler und hat höhere Chancen ein Erfolg zu werden.

Für WSGI gibt es mehrere Frameworks und kleinere Request-Handler, aber dieses Tutorial beschränkt sich auf den direkten Einsatz von WSGI.

Inhalt

Grundaufbau

Zunächst muss man wissen, was der Wrapper in etwa macht. Er nimmt ein Objekt entgegen und führt es aus:

   1 def pseudo_wrapper(obj):
   2     for line in obj({}, lambda x, y: None):
   3         print line

Ein Wrapper ruft also das übergebene Objekt auf und erwartet, dass es einen Iterator zurückgibt. Also muss eine Anwendung so aussehen:

   1 def app(environ, start_response):
   2     return iter() #irgendeinen iterator zurückgeben
   3 
   4 class Application(object):
   5     def __init__(self, environ, start_response):
   6         pass
   7     def __iter__(self):
   8         # einen iterator zurückgeben
   9         return iter()
  10 app = Application
  11 
  12 class Application(object):
  13     def __init__(self):
  14         pass
  15     def __call__(self, environ, start_response):
  16         # einen iterator zurückgeben
  17         return iter()
  18 app = Application()

In jedem Fall wäre dann die fertige Anwendung als "app" erreichbar.

Erste Anwendung

Als erste Anwendung wollen wir etwas ganz einfaches machen. Nämlich Hallo Welt ausgeben. Wir werden hierfür die Klassenvariante verwenden:

   1 def app(self, environ, start_response):
   2     start_response('200 OK', [('Content-Type', 'text/plain')])
   3     yield 'Hallo Welt'

Aber wie bekommt man die Anwendung jetzt zum Laufen? Das ist eine gute Frage, denn von Haus aus nämlich gar nicht. Damit WSGI funktioniert benötigt man einen Wrapper. Diese Anleitung überspringt das, wir gehen später nochmal darauf ein, hier werden wir wsgiref verwenden.

Dazu muss zunächst einmal wsgiref installiert sein (ist ab Python 2.5 schon dabei), und danach kann man an die application-Datei folgenden Code anhängen:

   1 if __name__ == '__main__':
   2     from wsgiref.simple_server import make_server
   3     srv = make_server('localhost', 4000, app)
   4     srv.serve_forever()

Dies versichert, dass ein Aufruf "python application.py" den Server startet, aber es einen CGI, FastCGI... Wrapper nicht behindert.

Wenn man jetzt die Datei mit python ausführt sollte man auf localhost:4000 Zugriff auf wsgiref haben und von "Hallo Welt" begrüßt werden.

Wenn was schief gelaufen ist, sollte der Debug-Output in der Konsole erscheinen.

Aufbau

Also der Aufbau ist ja mittlerweile eigentlich bekannt. start_response ist eine Methode um die Header an den Server zu senden. Was weniger bekannt ist, dass sie etwas zurückliefert. Nämlich eine Funktion um Daten an den Server zu senden. Per Definition sollte sie nicht verwendet werden, sondern Daten zurückiteriert werden (yield). Also vergessen wir das gleich wieder :-) Die write Funktion wird nämlich nicht an die Middleware Systeme geschickt.

Das environ wird unter Das WSGI Protokoll erklärt.


Das war jetzt mal der erste Ausflug in die WSGI-Welt und sollte zumindest eine kleine Basis schaffen.

Tags: Web | Wsgi

WSGI Anwendungen (last edited 2009-06-17 16:14:16 by localhost)