2

我正在使用 requests lib 和 python 2.7 执行此操作时:

import requests

uri_params = {
    u'email': u'myEmail@domain.com',
    u'id_user': 15,
    u'user_var': {
        u'var1': u'val1',
        u'var2': u'val2',
    }
}

r = requests.get('http://google.com/',  params=uri_params)
print r.url

结果它给了我: http ://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var=var1&user_var=var2

而不是 http://www.google.com/?id_user=15&email=myEmail%40domain.com&user_var%5Bvar1%5D=val1&user_var%5Bvar2%5D=val2 (= user_var[var1]=val1&user_var[var2]=val2)

您知道请求库是否可以作为处理此问题的方法吗?

编辑:我也花了几分钟时间了解如何使用 Martijn Pieters 的代码。所以这里是像我这样的 Python 新手的最终代码:

import requests
import urllib

def nested_object(name, mapping):
    return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]

uri_params = [
    (u'email', u'myEmail@domain.com'),
    (u'id_user', 15),
]

uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))
encoded = urllib.urlencode(uri_params)

r = requests.get('http://google.com/',  params=encoded)
print r.url
4

1 回答 1

2

不,requestslib 没有方法来处理它。

用于 GET 和 POST 请求的application/x-www-form-urlencoded编码标准只允许一级键值对,并且没有嵌套值的标准。相反,各种框架发明了自己的来处理这个问题。您正在查看许多变体之一。

您看到的输出是由urllib.urlencode()函数创建的,该函数通过多次重复键来处理序列;您的嵌套字典被视为一个序列,因此只有键被序列化。通常这将用于值列表,并模仿浏览器在序列化具有相同名称的多个表单字段时会执行的操作。

您必须自己编码嵌套字典:

def nested_object(name, mapping):
    return [(u'{}[{}]'.format(name, key), value) for key, value in mapping.iteritems()]

将返回一系列键值元组。保持其余 URL 参数的格式相同:

uri_params = [
    (u'email', u'myEmail@domain.com'),
    (u'id_user', 15),
]

uri_params.extend(nested_object(u'user_var', {u'var1': u'val1', u'var2': u'val2'}))
于 2013-07-10T07:27:09.347 回答