2

我的 Python FastCGI 代码有一个非常特殊的问题 - sys.stdout 的文件描述符为“-1”,所以我无法写入它。我在我的程序的第一行检查这个,所以我知道我的任何代码都没有改变它。

我试过sys.stdout = os.fdopen(1, 'w')了,但是那里写的任何东西都不会进入我的浏览器。

相同的应用程序在 Apache 下可以毫无困难地工作。

我正在使用 Microsoft 提供的用于 IIS 的 FastCGI 扩展,此处记录:http ://learn.iis.net/page.aspx/248/configuring-fastcgi-extension-for-iis60/

我在 fcgiext.ini 中使用这些设置:

    ExePath=C:\Python23\python.exe
    参数=-u C:\app\app_wsgi.py
    FlushNamedPipe=1
    请求超时=45
    空闲超时=120
    活动超时=30

谁能告诉我出了什么问题或告诉我应该去哪里寻找?

非常感谢所有建议...

4

5 回答 5

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

如果这是一个愚蠢的问题,请原谅我,但我在您的配置文件中注意到这一行:

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

您正在运行 WSGI 应用程序还是 FastCGI 应用程序?有区别。在 WSGI 中,写入标准输出并不是一个好主意。你的程序应该有一个应用程序对象,可以使用环境字典和 start_response 函数调用(有关更多信息,请参阅PEP 333)。无论如何,您的应用程序的返回方法将是返回一个包含响应正文的可迭代对象,而不是写入标准输出。

无论哪种方式,您还应该考虑使用isapi-wsgi。我自己从未使用过它,但我听到了关于它的好消息。

于 2008-12-11T13:24:48.503 回答
1

我相信标准输出关闭/无效符合FastCGI 规范

当应用程序开始执行时,Web 服务器会留下一个单独的文件描述符 FCGI_LISTENSOCK_FILENO。该描述符指的是由 Web 服务器创建的侦听套接字。

FCGI_LISTENSOCK_FILENO 等于 STDIN_FILENO。标准描述符 STDOUT_FILENO 和 STDERR_FILENO 在应用程序开始执行时关闭。应用程序确定它是使用 CGI 还是 FastCGI 调用的可靠方法是调用 getpeername(FCGI_LISTENSOCK_FILENO),该方法返回 -1,并且对于 FastCGI 应用程序将 errno 设置为 ENOTCONN。

于 2011-03-31T00:05:02.630 回答
0

在 Windows 上,可以在没有有效标准输入和标准输出的情况下启动进程。例如,如果您使用 pythonw.exe 执行 python 脚本,stdout 是无效的,如果您坚持写入它,它将在 140 个字符后阻塞。

写入到 stdout 以外的另一个目的地似乎是最安全的解决方案。

于 2008-12-11T15:01:21.320 回答
0

在 PEP 333 之后,您可以尝试登录到 environ['wsgi.errors'],这通常是您使用 fastcgi 时 Web 服务器本身的记录器。当然,这仅在调用请求时可用,但在应用程序启动期间不可用。

您可以在 pylons 代码中获取示例:http: //pylonshq.com/docs/en/0.9.7/logging/#logging-to-wsgi-errors

于 2009-08-25T14:14:01.837 回答