Nachdem wir bereits ein Hello World durch den in Django eingebauten Webserver haben ausgeben lassen, beschaeftigen wir uns nun damit, wie dies aussehen muss, falls wir dies mittels WSGI durch einen anderen Webserver ausgeben lassen wollen.

Im Folgenden werde ich gunicorn verwenden, jedoch sollte uwsgi oder mod_wsgi (fuer den Apache) genau so gut funktionieren. Dabei sei auch erwaehnt, dass ich noch nicht ausreichend Erfahrung mit uwsgi und gunicorn habe um fuer eine der beiden Seiten Partei zu ergreifen, bisher erscheint mir dies eher eine Glaubensfrage zu sein. Wer jedoch Apache nutzt und nur eine Python-Version braucht, wird mit mod_wsgi gluecklich sein.

Environment erweitern

Neben Django benoetigen wir nun auch noch gunicorn:

(helloworld)cp@venus:~$ pip install gunicorn
Downloading/unpacking gunicorn
  Downloading gunicorn-19.3.0-py2.py3-none-any.whl (110kB): 110kB downloaded
Installing collected packages: gunicorn
Successfully installed gunicorn
Cleaning up...

Angepasstes Script

import django
from django.conf import settings
from django.conf.urls import url
from django.core.handlers.wsgi import WSGIHandler
from django.http import HttpResponse


settings.configure(DEBUG=True, MIDDLEWARE_CLASSES=(), ROOT_URLCONF=__name__)


def index(request):
    return HttpResponse('Hello World')


urlpatterns = [url(r'', index)]


django.setup()
application = WSGIHandler()

Ergebnis

(helloworld)cp@venus:~$ gunicorn hello
[2015-05-08 18:08:02 +0200] [21507] [INFO] Starting gunicorn 19.3.0
[2015-05-08 18:08:02 +0200] [21507] [INFO] Listening at: http://127.0.0.1:8000 (21507)
[2015-05-08 18:08:02 +0200] [21507] [INFO] Using worker: sync
[2015-05-08 18:08:02 +0200] [21510] [INFO] Booting worker with pid: 21510

In einem anderen Terminal/Fenster:

cp@venus:~$ curl -i http://127.0.0.1:8000
HTTP/1.1 200 OK
Server: gunicorn/19.3.0
Date: Fri, 08 May 2015 16:08:17 GMT
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

Hello World

Was passiert hier?

Im Grossen und Ganzen ist es ziemlich aehnlich zu dem Vorherigen, jedoch verzichten wir auf das Parsen und Verarbeiten der Kommandozeilen-Parameter, da das Skript nun von einer anderen Python-Anwendung eingebunden wird. Aus diesem Grund faellt auch der if __name__ == '__main__'-Block weg.

django.setup()

In unserem vorherigen Beispiel wurde dies irgendwo in den Tiefen des execute_from_command_line ausgefuehrt. Nun lassen wir Django sich jedoch direkt in unserem Skript initialisieren. Und auch hier gilt wieder, wenn wir DJANGO_SETTINGS_MODULE gesetzt haetten und es nicht vorher schon konfiguriert haetten, haette Django nun diese Variable ausgewertet und sich daher seine Konfiguration geholt.

application = WSGIHandler()

Hier weisen wir der Variable application den WSGI-Handler zu. Dabei ist application bei den 3 oben genannten WSGI HTTP-Servern der Standard wonach gesucht wird. Bei allen kann dies jedoch mehr oder weniger kompliziert geaendert werden.


Christian Prehl | 10. Mai 2015 | Tags: django hello world tutorial python wsgi