2

Python FastCGIコードに非常に特有の問題があります。sys.stdoutのファイル記述子は「-1」であるため、書き込むことができません。プログラムの最初の行でこれをチェックしているので、コードが変更されていないことがわかります。

試しましたがsys.stdout = os.fdopen(1, 'w')、そこに書かれているものはブラウザに届きません。

同じアプリケーションがApacheで問題なく動作します。

ここに記載されているIIS用のMicrosoft提供のFastCGI拡張機能を使用しています:http://learn.iis.net/page.aspx/248/configuring-fastcgi-extension-for-iis60/

私はfcgiext.iniでこれらの設定を使用しています:

    ExePath = C:\ Python23 \ python.exe
    引数=-uC:\ app \ app_wsgi.py
    FlushNamedPipe = 1
    RequestTimeout = 45
    IdleTimeout = 120
    ActivityTimeout = 30

誰かが何が悪いのか、どこを見ればいいのか教えてもらえますか?

すべての提案は大歓迎です...

4

5 に答える 5

1

これがばかげた質問である場合は申し訳ありませんが、構成ファイルに次の行があることに気付きました。

引数=-u C:\app\app_wsgi.py

WSGI アプリケーションまたは FastCGI アプリケーションを実行していますか? 違いがあります。WSGI では、stdout への書き込みはお勧めできません。プログラムには、環境辞書と start_response 関数で呼び出すことができるアプリケーション オブジェクトが必要です (詳細については、PEP 333を参照してください)。いずれにせよ、アプリケーションが返す方法は、標準出力に書き込むのではなく、応答本文を含む反復可能なオブジェクトを返すことです。

いずれにせよ、 isapi-wsgi の使用も検討する必要があります。私自身は使ったことはありませんが、良いと聞いています。

于 2008-12-11T13:24:48.503 に答える
1

FastCGI を使用する必要がありますか? そうでない場合は、ISAPI WSGI メソッドを試してください。私は以下を使用して成功しました:

http://code.google.com/p/isapi-wsgi/

また、過去に PyISAPIe を使用したことがあります。

http://sourceforge.net/apps/trac/pyisapie

于 2009-09-30T20:58:52.560 に答える
1

標準出力をクローズ/無効にすることは、FastCGI仕様に従っていると思います:

Web サーバーは、アプリケーションが実行を開始するときに、1 つのファイル記述子 FCGI_LISTENSOCK_FILENO を開いたままにします。この記述子は、Web サーバーによって作成された listen ソケットを参照します。

FCGI_LISTENSOCK_FILENO は STDIN_FILENO と同じです。標準記述子 STDOUT_FILENO および STDERR_FILENO は、アプリケーションが実行を開始すると閉じられます。アプリケーションが CGI と FastCGI のどちらを使用して呼び出されたかを判断する信頼できる方法は、getpeername(FCGI_LISTENSOCK_FILENO) を呼び出すことです。FastCGI アプリケーションの場合、errno を ENOTCONN に設定して -1 を返します。

于 2011-03-31T00:05:02.630 に答える
0

PEP 333に続いて、fastcgiを使用する場合は通常Webサーバー自体のロガーであるenviron['wsgi.errors']へのログ記録を試みることができます。もちろん、これはリクエストが呼び出されたときにのみ利用できますが、アプリケーションの起動時には利用できません。

pylonsコードで例を取得できます:http://pylonshq.com/docs/en/0.9.7/logging/#logging-to-wsgi-errors

于 2009-08-25T14:14:01.837 に答える
0

Windows では、有効な stdin と stdout なしでプロセスを起動することができます。たとえば、pythonw.exe で python スクリプトを実行すると、stdout が invdalid になり、書き込みを要求すると、140 文字か何かでブロックされます。

stdout 以外の宛先への書き込みが最も安全な解決策のようです。

于 2008-12-11T15:01:21.320 に答える