将 Python(2.7) 字典转换为有效的查询参数

Convert Python(2.7) dictionary to valid query params

到目前为止,我一直在四处寻找,找到了一些热门歌曲,但没有找到与 IMO 法案完全相符的。我想要做的是使用一个名为 'result' 的 Python 字典(注意 'keyword_scores' 是一个字典列表,在 'data' 字典中。):

>>> print result
>>> {   
        u'data': {   
            u'clean_table': u'true',
            u'keyword_scores': [   
                {   
                    u'keyword': u'edited for easy reading on SO',
                    u'score': 0.4054651081081644
                }
            ],
            u'user_id': u'2'
        }
    }

并且,至少我认为,使用

的某种组合
urllib.urlencode()

urlparse.parse_qs()

能够将 'query_string' 连接到 URL 以供内部使用:

urllib2.Request(host_domain + some_post_data_endpoint + query_string)

我只推荐这些库,因为根据我目前的搜索,我认为我需要使用这些库,但我对此处使用的方法和工具持开放态度。我遇到的问题是,无论出于何种原因,我似乎需要在调用 parse_qs() 之前对其进行 urlencode(),但其他建议说我需要先调用 parse_qs()编码。似乎没有一种简洁的方法可以将不完全 "flat" 的字典转换为查询参数以供 urllib2.Request() 使用。

提前致谢!

我假设您有一些要将数据 post 到的端点。然后您可以执行以下操作并解码端点处的 url:

import urllib
result = {u'data': {u'clean_table': u'true',u'keyword_scores': [{u'keyword': u'edited for easy reading on SO', u'score': 0.4054651081081644}],u'user_id': u'2'}}
result_string = urllib.urlencode(result)
urllib2.Request(host_domain + some_post_data_endpoint + "?result=" + result_string)

例如,如果您的端点是 JS,您只需执行以下操作即可获得与同一字典相同的结果:

var url = new URL(window.location.href);
var result = JSON.parse(url.searchParams.get("result"));

我解决这个问题的方法是利用 Postman 找出它是如何对 URL 进行编码的,同时还切换到使用请求库而不是 urllib2/urllib。

类似于:

raw_json = json.dumps(result)
encoded_json = urllib.quote(raw_json)
tmp = Template("data=$d")
# request will look like encoded nonsense like "data=%7B%22clean_table%22%3A%20true%2C%20%22keyword_scores%22%3A%20%5B%7B%22score%22%3A%200.4054651081081644%2C%20%22keyword%22%3A%20%22bruins%22%7D%5D%2C%20%22user_id%22%3A%20%222%22%7D"
request = tmp.substitute(d=encoded_json)
headers = {
    'Content-Type': "application/x-www-form-urlencoded"
}
response = requests.request("POST", url, data=request, headers=headers)

注意:headers 参数是必需的。