我的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 Arguments=-u C:\app\app_wsgi.py FlushNamedPipe=1 RequestTimeout=45 IdleTimeout=120 ActivityTimeout=30
任何人都可以告诉我什么是错的或者告诉我应该在哪里找出来吗?
所有建议都非常感谢......
答案 0 :(得分:1)
请原谅我这是一个愚蠢的问题,但我在配置文件中注意到这一行:
参数= -u C:\ app \ app_wsgi.py
您运行的是WSGI应用程序还是FastCGI应用程序? 是的区别。在WSGI中,写入stdout并不是一个好主意。您的程序应该有一个可以使用环境dict和start_response函数调用的应用程序对象(有关详细信息,请参阅PEP 333)。无论如何,你的应用程序的返回方法是返回一个包含响应体的可迭代对象,而不是写入stdout。
无论哪种方式,您还应该考虑使用isapi-wsgi。我自己从未使用它,但我听到了很多好消息。
答案 1 :(得分:1)
你必须使用FastCGI吗?如果没有,您可能想尝试ISAPI WSGI方法。我成功使用了:
http://code.google.com/p/isapi-wsgi/
并且过去也使用过PyISAPIe:
答案 2 :(得分:1)
我认为stdout已关闭/无效符合FastCGI spec:
Web服务器只保留一个文件 描述符,FCGI_LISTENSOCK_FILENO, 在应用程序开始时打开 执行。该描述符指的是a 由Web创建的侦听套接字 服务器。
FCGI_LISTENSOCK_FILENO等于 STDIN_FILENO。标准描述符 STDOUT_FILENO和STDERR_FILENO是 申请开始时关闭 执行。一种可靠的方法 申请确定是否 使用CGI或FastCGI调用 呼叫 getpeername(FCGI_LISTENSOCK_FILENO), 在errno设置为的情况下返回-1 ENOTCONN用于FastCGI应用程序。
答案 3 :(得分:0)
在Windows上,可以启动没有有效stdin和stdout的进程。例如,如果你用pythonw.exe执行python脚本,stdout就是invdalid,如果你坚持写它,它会在140个字符之后阻塞。
写入除stdout之外的其他目的地看起来是最安全的解决方案。
答案 4 :(得分:0)
在PEP 333之后,你可以尝试登录environ ['wsgi.errors'],当你使用fastcgi时,它通常是web服务器本身的记录器。当然,这仅在调用请求时可用,但在应用程序启动期间不可用。
您可以在pylons代码中获取示例:http://pylonshq.com/docs/en/0.9.7/logging/#logging-to-wsgi-errors