2016-05-12 1 views
1

Als ein kompletter Python-Neuling, der gerade die kostenlosen Lektionen in der Codeacademy abgeschlossen hat, folgte ich den Anweisungen auf this Python wfastcgi 2.2 page und installierte erfolgreich den Python-Handler auf IIS.Wie beginne ich die Python-Webprogrammierung mit WFastCGI + IIS + Python 3.4?

Dann habe ich eine Python-Datei (Modul) my_app.py gemäß der web.config mit dem folgenden Code (was ich von irgendwo angepasst):

def wsgi_app(environ, start_response): 
    status = '200 OK' 
    response_headers = [('Content-type','text/plain')] 
    start_response(status, response_headers) 
    return ['Hello world!\n'] 

Nach auf den lokalen Host-Website navigieren, gibt IIS den folgenden Fehler:

Error occurred while reading WSGI handler: 

Traceback (most recent call last): 
    File "C:\Python34\lib\site-packages\wfastcgi.py", line 779, in main 
    env, handler = read_wsgi_handler(response.physical_path) 
    File "C:\Python34\lib\site-packages\wfastcgi.py", line 621, in read_wsgi_handler 
    handler = get_wsgi_handler(os.getenv('WSGI_HANDLER')) 
    File "C:\Python34\lib\site-packages\wfastcgi.py", line 594, in get_wsgi_handler 
    handler = handler() 
TypeError: wsgi_app() missing 2 required positional arguments: 'environ' and 'start_response' 


StdOut: 

StdErr: 

Frage:

  1. Wie und was gebe ich für die 2 Funktionsargumente?
  2. Das Starten des Moduls mit einer Funktion scheint keine gute Idee zu sein. Kann ich stattdessen eine Klasse verwenden? Wenn ja, wie soll ich meine web.config auf dieser Linie ändern:
<add key="WSGI_HANDLER" value="my_app.wsgi_app()" /> 
+0

Was bedeuten die letzten fehlerhaften Baumzeilen? – linusg

+0

Sie rufen die Funktion nicht auf, WSGI tut dies, so dass Sie sich keine Gedanken darüber machen müssen, was sie übergibt. Und Python ist völlig in Ordnung mit Funktionen auf der obersten Ebene; Hier ist keine Klasse erforderlich. Schließlich würde dieser Code diesen Fehler nicht geben; Bitte posten Sie den eigentlichen Code. –

+0

Hoppla, du hast Recht. Es gab eine index.php verwirrte die Standard-Dokumentenverarbeitung, denke ich. Der Fehler wurde aktualisiert. – Jake

Antwort

1

Meine erste Empfehlung (wenn Sie nicht bereits getan haben) zu Anforderungsfehler in IIS konfigurieren Tracing. Wann immer Ihr WSGI-Handler (zB my_app.wsgi_app) während der Entwicklung abstürzt, erzeugt IIS eine nette .xml-Datei, die Sie in einem Browser anzeigen können, einschließlich des Python-Tracebacks, selbst wenn Ihr IIS letztendlich zum Generieren konfiguriert ist "500 - Interner Serverfehler" in diesem Fall.

Als nächstes, wie Daniel Roseman bereits vorgeschlagen hat, ändern

<add key="WSGI_HANDLER" value="my_app.wsgi_app()" /> 

zu

<add key="WSGI_HANDLER" value="my_app.wsgi_app" /> 

in Ihrer web.config-Datei und wfastcgi.py wird in der Lage sein, Ihre wsgi_app zu finden und aufzurufen.

schließlich als wsgi_app gezeigt wird (glaube ich) mit einem Python-Traceback fehlschlagen wie folgt:

File "<the path to ...\python\pythonXX\lib\site-packages\wfastcgi.py on your system>", line 372, in send_response 
raise TypeError("content must be encoded before sending: %r" % content) 
TypeError: content must be encoded before sending: 'Hello world!\n' 

Die Lösung dieser Codierung Problem wird in David Beazley "Python: Essential Reference" in dem Abschnitt auf wsgiref (Seite 541 in meiner Kopie). Ich würde vorschlagen, dass Sie Folgendes versuchen:

def wsgi_app(environ, start_response): 
    status = "200 OK" 
    headers = [("Content-Type", "text/plain; charset=utf-8")] 
    start_response(status, headers) 

    response = ["Hello world!\n"] 

    return (line.encode("utf-8") for line in response) 

Hoffe, das hilft.