Python FastCGI под IIS - проблемы с написанием стандартного вывода - PullRequest
2 голосов
/ 10 декабря 2008

У меня очень специфическая проблема в моем коде Python FastCGI - sys.stdout имеет файловый дескриптор '-1', поэтому я не могу записать его Я проверяю это в первой строке моей программы, поэтому я знаю, что это не мой код, меняющий ее.

Я пробовал sys.stdout = os.fdopen(1, 'w'), но все, что там написано, не попадет в мой браузер.

То же приложение без проблем работает под Apache.

Я использую предоставленное Microsoft расширение FastCGI для IIS, задокументированное здесь: http://learn.iis.net/page.aspx/248/configuring-fastcgi-extension-for-iis60/

Я использую эти настройки в fcgiext.ini:

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

Может кто-нибудь сказать, что не так или сказать мне, где я должен искать, чтобы узнать?

Все предложения с благодарностью ...

Ответы [ 5 ]

1 голос
/ 31 марта 2011

Я считаю, что закрытый / недействительный стандартный вывод соответствует спецификации FastCGI :

Веб-сервер оставляет один файл дескриптор, FCGI_LISTENSOCK_FILENO, открыть, когда приложение начинается выполнение. Этот дескриптор относится к сокет прослушивания, созданный в Интернете сервер.

FCGI_LISTENSOCK_FILENO равно STDIN_FILENO. Стандартные дескрипторы STDOUT_FILENO и STDERR_FILENO являются закрыто, когда начинается приложение выполнение. Надежный метод для приложение, чтобы определить, является ли оно был вызван с использованием CGI или FastCGI для вызов getpeername (FCGI_LISTENSOCK_FILENO), который возвращает -1 с errno установленным в ENOTCONN для приложения FastCGI.

1 голос
/ 01 октября 2009

Вам нужно использовать FastCGI? Если нет, вы можете попробовать метод ISAPI WSGI. Я имел успех, используя:

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

, а также использовали PyISAPIe в прошлом:

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

1 голос
/ 11 декабря 2008

Простите, если это глупый вопрос, но я заметил эту строку в вашем конфигурационном файле:

Аргументы = -u C: \ app \ app_wsgi.py

Запускаете ли вы приложение WSGI или приложение FastCGI? Там есть разница. В WSGI писать в stdout не очень хорошая идея. Ваша программа должна иметь объект приложения, который можно вызывать с помощью dict окружения и функции start_response (для получения дополнительной информации см. PEP 333 ). В любом случае, метод возврата вашего приложения будет возвращать итеративный объект, содержащий тело ответа, а не запись в стандартный вывод.

В любом случае, вам также следует рассмотреть возможность использования isapi-wsgi . Я никогда не использовал это сам, но слышу хорошие слова об этом.

0 голосов
/ 25 августа 2009

После PEP 333 вы можете попытаться войти в среду ['wsgi.errors'], которая обычно является регистратором самого веб-сервера при использовании fastcgi. Конечно, это доступно только при вызове запроса, но не при запуске приложения.

Вы можете получить пример в коде пилонов: http://pylonshq.com/docs/en/0.9.7/logging/#logging-to-wsgi-errors

0 голосов
/ 11 декабря 2008

В Windows можно запустить процесс без действительного ввода stdin и stdout. Например, если вы выполняете скрипт python с помощью pythonw.exe, стандартный вывод является invdalid, и если вы настаиваете на записи в него, он будет блокироваться после 140 символов или чего-то еще.

Запись в другое место назначения, кроме stdout, выглядит наиболее безопасным решением.

...