2016-05-12 11 views
1

codeacademyの無料レッスンを終えたばかりの完全なpython入門者として、私はthis Python wfastcgi 2.2 pageの指示に従い、IISにpythonハンドラを正常にインストールしました。WFastCGI + IIS + Python 3.4でPython Webプログラミングを開始するには?

は、その後、私は(私はどこかから適合)以下のコードでweb.configに従ってPythonのファイル(モジュール)my_app.pyを作成した:

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

ローカルホストサイトにナビゲートすると、IISは次のエラーを戻します。

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: 

質問

  1. 2つの関数の引数にはどのように渡されますか?
  2. 関数を使ってモジュールを起動することは良い考えのようではありません。代わりにクラスを使うことはできますか?もしそうなら、どのように私はこのライン上で私のweb.configを変更する必要があります。
<add key="WSGI_HANDLER" value="my_app.wsgi_app()" /> 
+0

エラー出力の最後のツリー行は何を意味しますか? – linusg

+0

WSGIは関数を呼び出さないため、渡す内容について心配する必要はありません。 Pythonはトップレベルの機能を持つことで完璧です。ここにクラスは必要ありません。最後に、そのコードはそのエラーを与えません。実際のコードを投稿してください。 –

+0

あなたは正しいです。私が思うデフォルトの文書処理を乱すindex.phpがありました。エラーを更新しました。 – Jake

答えて

1

私の最初の勧告は、(まだ行っていない場合)IISで失敗した要求トレースを構成することです。その後、開発中にWSGIハンドラ(my_app.wsgi_app)がクラッシュすると、IISは最終的に生成するように設定されていてもPythonのトレースバックを含め、ブラウザで表示できる素敵な.xmlファイルを生成しますこの場合、「500 - 内部サーバーエラー」。

次に、ダニエルローズマンはすでに示唆したように、あなたのweb.configファイルとwfastcgi.pyに

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

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

を変更するには、あなたのwsgi_appを見つけて呼び出すことができるようになります。

最後に、(私は信じている)Pythonのトレースバックで失敗します示すように、あなたのwsgi_appは、次のように:

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' 

このエンコードの問題を解決するには、デビッド・ビーズリーの「Pythonの:エッセンシャル・リファレンス」に記述されているセクションにon wsgiref(私のコピーの541ページ)。次のように試してみることをおすすめします。

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) 

希望します。