【问题标题】:Python FastCGI under IIS - stdout writing problemsIIS下的Python FastCGI——stdout写入问题
【发布时间】:2008-12-10 14:04:51
【问题描述】:

我的 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

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

非常感谢所有建议...

【问题讨论】:

    标签: python iis stdout fastcgi


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 根本不是一个愚蠢的问题——我应该在我的问题中提到这一点...app_wsgi.py 调用一个 FastCGI 库,然后调用我的 WSGI 应用程序。写入标准输出时出现问题的是 FastCGI 库。
    【解决方案2】:

    你必须使用 FastCGI 吗?如果没有,您可能想尝试 ISAPI WSGI 方法。我已经成功使用:

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

    并且过去也使用过 PyISAPIe:

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

    【讨论】:

    • 最多不能超过 1 个 URL 是自我施加的约束还是 SO 施加的约束?无论如何...sourceforge.net/apps/trac/pyisapie
    • 因为我是新用户所以强制执行,但我现在修复了它
    【解决方案3】:

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

    Web 服务器只留下一个文件 描述符,FCGI_LISTENSOCK_FILENO, 申请开始时打开 执行。这个描述符是指一个 Web 创建的监听套接字 服务器。

    FCGI_LISTENSOCK_FILENO 等于 STDIN_FILENO。标准描述符 STDOUT_FILENO 和 STDERR_FILENO 是 申请开始时关闭 执行。一种可靠的方法 应用程序来确定它是否 使用 CGI 或 FastCGI 调用是为了 称呼 getpeername(FCGI_LISTENSOCK_FILENO), 返回 -1 并将 errno 设置为 用于 FastCGI 应用程序的 ENOTCONN。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我已经在使用 python.exe 来尝试确保获得有效的标准输出。我有一个可以读取数据的有效标准输入,但不是有效的标准输出......不幸的是,FastCGI 规范说服务器正在监听我在标准输出上写入 FastCGI 数据,所以我不能只是改变我做的方式它...
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        • 2013-06-14
        • 2012-06-18
        • 2020-04-09
        相关资源
        最近更新 更多