15

这一定是一个非常简单的问题,但我似乎无法弄清楚。

我正在使用 apache + mod_wsgi 来托管我的 python 应用程序,并且我想获取以其中一种形式提交的帖子内容——但是,环境值和 sys.stdin 都不包含任何这些数据。介意帮我一把吗?

编辑:已经尝试过:

  • environ["CONTENT_TYPE"] = 'application/x-www-form-urlencoded' (无数据)
  • environ["wsgi.input"] 似乎是一种合理的方式,但是 environ["wsgi.input"].read() 和 environ["wsgi.input"].read(-1) 返回一个空字符串(是的, 内容已发布,并且 environ["request_method"] = "post"
4

2 回答 2

22

PEP 333你必须阅读 environ['wsgi.input']

我刚刚保存了以下代码并让 apache 的 mod_wsgi 运行它。有用。

你一定做错了什么。

from pprint import pformat

def application(environ, start_response):
    # show the environment:
    output = ['<pre>']
    output.append(pformat(environ))
    output.append('</pre>')

    #create a simple form:
    output.append('<form method="post">')
    output.append('<input type="text" name="test">')
    output.append('<input type="submit">')
    output.append('</form>')

    if environ['REQUEST_METHOD'] == 'POST':
        # show form data as received by POST:
        output.append('<h1>FORM DATA</h1>')
        output.append(pformat(environ['wsgi.input'].read()))

    # send results
    output_len = sum(len(line) for line in output)
    start_response('200 OK', [('Content-type', 'text/html'),
                              ('Content-Length', str(output_len))])
    return output
于 2008-12-27T01:22:33.457 回答
14

请注意,从技术上讲,在 wsgi.input 上调用 read() 或 read(-1) 是违反 WSGI 规范的,即使 Apache/mod_wsgi 允许这样做。这是因为 WSGI 规范要求提供有效的长度参数。WSGI 规范还说您不应该读取超过 CONTENT_LENGTH 指定的数据。

因此,上面的代码可能在 Apache/mod_wsgi 中工作,但它不是可移植的 WSGI 代码,并且在其他一些 WSGI 实现上会失败。要正确,请确定请求内容长度并将该值提供给 read()。

于 2009-06-24T12:31:53.310 回答