如何为请求库创建嵌套参数

时间:2019-02-28 14:35:02

标签: python python-requests query-parameters

我正在使用流行的请求库来从API请求数据。以下作品:

import requests

parameters = {
        'action': 'query_plugins',
        'per_page': 10,
        'browse': 1,
        'page': 1,
}

response = requests.get('https://api.wordpress.org/plugins/info/1.1/', parameters)

results = response.json()

print(results)

但是有一些嵌套的参数,例如,这是我可能查询的URL:

  

https://api.wordpress.org/plugins/info/1.1/?action=query_plugins&request[per_page]=10&request[browse]=1&request[page]=1&request[fields][description]=0&request[fields][sections]=0'

在上述情况下,我需要传递以下嵌套参数:

request[fields][description]
request[fields][sections]

这怎么实现?

2 个答案:

答案 0 :(得分:0)

如果我正确阅读了this issue,则可以简单地使用方括号名称作为参数的键(请参见this comment):

import requests

parameters = {
    'action': 'query_plugins',
    'per_page': 10,
    'browse': 1,
    'page': 1,
    'request[fields][description]': 0,
    'request[fields][sections]': 0
}

response = requests.get('https://api.wordpress.org/plugins/info/1.1/', parameters)

results = response.json()

答案 1 :(得分:0)

您可以使用递归函数将参数从dict字典展平为API要求的方括号格式的键值对:

def params(name, parameters):
    def flatten(d):
        for k, v in d.items():
            if isinstance(v, dict):
                for s, i in flatten(v):
                    yield '[%s]%s' % (k, s), i
            else:
                yield '[%s]' % k, v
    return {name + k: v for k, v in flatten(parameters)}

parameters = {
    'per_page': 10,
    'browse': 1,
    'page': 1,
    'fields': {
        'description': 0,
        'sections': 0
    }
}
response = requests.get(
    'https://api.wordpress.org/plugins/info/1.1/',
    {'action': 'query_plugins', **params('request', parameters)}
)