为什么environ['QUERY_STRING']返回零长度字符串?

1 投票
1 回答
1153 浏览
提问于 2025-04-17 03:11

我找到了我这个“傻瓜”问题的解决办法,下面列出来了。

我在Ubuntu 11.04上使用的是Python 2.7.1+。客户端和服务器在同一台电脑上。

通过Wing调试器,我知道服务器的代码正在被调用,而且我可以逐行查看代码。在这个情况下,我知道传输了22个字节的数据。

在Firebug中,我在网络的Post标签下看到了这些数据:

Parameter   application/x-www-form-urlencoded
fname   first
lname   last
Source
Content-Type: application/x-www-form-urlencoded
Content-Length: 22 fname=first&lname=last

这是我使用的客户端代码:

<html>
     <form action="addGraphNotes.wsgi" method="post">
         First name: <input type="text" name="fname" /><br />
         Last name: <input type="text" name="lname" /><br />
         <input type="submit" value="Submit" />
    </form>
</html>

这是服务器代码:

import urlparse 

def application(environ, start_response):
    output = []

    # the environment variable CONTENT_LENGTH may be empty or missing
    try:
    # NOTE: THIS WORKS. I get a value > 0 and the size appears correct (22 bytes in this case)
        request_body_size = int(environ.get('CONTENT_LENGTH', 0))
    except (ValueError):
        request_body_size = 0

    try:
        # environ['QUERY_STRING'] returns ""
        **values = urlparse.parse_qs( environ['QUERY_STRING'] )**
    except:
        output = ["parse error"]

在Wing调试器中,我确认了数据是从客户端传递到服务器的:

>>> environ['wsgi.input'].read()
'fname=first&lname=last'

我找到了我的问题。我复制粘贴了错误的代码。这是我之前用来处理表单的代码,但在开始使用AJAX后就不再用了。现在,一切都正常了。

# When the method is POST the query string will be sent
# in the HTTP request body which is passed by the WSGI server
# in the file like wsgi.input environment variable.
request_body = environ['wsgi.input'].read(request_body_size)

values = parse_qs(request_body) 

1 个回答

3

你正在进行一个 POST 请求,所以 QUERY_STRING 确实会是空的,因为它代表的是 GET 请求的查询字符串(它也可能出现在其他类型的请求中,但和你现在的问题没有关系)。你应该通过读取 wsgi.input 流来解析 POST 数据。

撰写回答