Will man eine Webseite mit Python ausliefern, findet man im Internet etwa eine Millionen Anleitungen. Aber 99,999% davon sind für Apache oder nginx, der Rest für andere mir unbekannte Webserver.

Über Python auf IIS redet leider niemand, da ich diesen Anwendungsfall nun heute hatte, will ich mal eine Lanze brechen und unabhängig vom Sinn beschreiben wie man Python von Microsofts IIS (Internet Information Service) ausliefern lassen kann.

Man kann den IIS auf zwei Arten dazu bringen Pythonfiles anzusprechen. Über (Fast-) CGI oder über WSGI. Über CGI lässt sich Python leider nur als Scriptsprache verwenden, man kann damit z.B. Forms auswerten oder ähnliches.

Man könnte auch den kompletten HTML Quelltext aus diesem Script generieren lassen, dass will man aber nicht ;)

Wer diese Möglichkeit trotzdem braucht, hier die Anleitung.

  • Python installieren
  • IIS-Manager öffnen
  • Webdiensterweiterungen -> neue Webdiensterweiterung
  • Name: Python CGI
  • Erforderliche Daten: Hier gebt ihr nun den Pfad zur Python.exe ein und hängt die Parameter -u "%s" "%s" an der Pfad sollte dann in etwa so aussehen
c:/Python27/Python.exe -u "%s" "%s"

Öffnet nun die Eigenschaften eurer Website im Reiter Basisverzeichnis müsst ihr die Ausführberechtigungen auf "Skripts und ausführbare Dateien" stellen. Zuletzt müsst ihr im Reiter Dokumente noch eine Standardinhaltsseite hinzufügen. z.B. index.py oder scipt.py je nach dem wie ihr eure Scripte nennen wollt.

Womöglich gibt es noch andere Wege, wie man Python als CGI Script einstellen kann, dies ist aber mein Weg.

Kommen wir nun zum wichtigen Teil.

Python mittels Webframework als vollwertige dynamische Seite zu publizieren. Hierzu muss eure "WebApp" über einen WSGI Handler aufgerufen werden. Bei Apache kann dies der mod_wsgi sein und bei nginx uwsgi.

Für eine funktionierende IIS variante musste ich lange suchen. Diese nennt sich ISAPI WSGI und wurde auf Google Code zur verfügung gestellt.

Die Installation dieses Handlers funktioniert am besten über die Setuptools
Vorher müsst ihr allerdings noch die Abhängigkeiten installieren, in diesem Fall ist das PyWin32 Nach der installation der Tools und Abhängigkeiten könnt ihr auf der Konsole einfach
easy_install isapi_wsgi

eingeben und der Handler wird installiert.

Um diesen nun auch benutzen zu können, müsst ihr ein paar Codezeilen in euer Projekt einfügen. Ich hab es nur mit Python und dem Webframework Flask probiert, sollte aber auch mit Django funktionieren.

Öffnet das Pythonfile in dem eure App deklariert wird, im Falle von Flask ist es das File in dem

app = Flask(name)

steht.

Überprüft dabei auch gleich, dass nirgends mehr ein app.run() auftaucht, kommentiert dieses gegebenenfalls aus.

Zu euren Importen fügt ihr nun

import isapi_wsgi

hinzu.

Als nächstes deklariert ihr folgende Methode:

def __ExtensionFactory__(): 
    return isapi_wsgi.ISAPISimpleHandler(app)

Als letzte Änderung fügt ihr folgendes hinzu:

if __name__ == '__main__':
    # If run from the command-line, install ourselves.
from isapi.install import *
params = ISAPIParameters()
    # Setup the virtual directories - this is a list of directories our
    # extension uses - in this case only 1.
    # Each extension has a "script map" - this is the mapping of ISAPI
    # extensions.
sm = [
    ScriptMapParams(Extension="*", Flags=0)
]
    # To serve from root, just set Name="/"
vd = VirtualDirParameters(Name="/",
                          Description = "App Beschreibung",
                          ScriptMaps = sm,
                          ScriptMapUpdate = "replace"
)
params.VirtualDirs = [vd]
HandleCommandLine(params)

Zu guter letzt müsst ihr mittels Konsole eure App mit dem Parameter install aufrufen python meineApp.py install

Dabei wird im Hintergrund automatisch der eine Webdiensterweiterung und ein Anwendungspool angelegt. Im Verzeichnis eurer App erscheint nun eine dll Datei mit _$Appname als Name. Diese nicht löschen!

Ruft ihr nun euren Webserver im Browser auf, sollte euch eure App entgegenstrahlen.

Ein Installations-Wiki findet ihr hier.