如何对 python 中的多值键进行 urlencode?

How to urlencode multi valued keys in python?

我想在 python 中执行此操作:

curl 'http://localhost:8983/solr/samos/select?rows=0&q=*:*&fq=time:\[2012-08-01T00:00:00Z%20TO%202013-10-01T00:00:00Z\]&fq=loc:\[15,-45%20TO%2030,-30\]'

所以我做了一个字典并尝试了请求:

webpage = 'http://localhost:8983/solr/samos/select'
query_args = {
    'q' : '*:*', \
    'fq' : ['time:[2012-08-01T00:00:00Z TO 2013-10-01T00:00:00Z]', \
    'fq' : 'loc:[15,-45 TO 30,-30]', \
    'rows' : '0' \
}
query = urllib.urlencode(query_args)
req = urllib2.Request(webpage, query)
res = urllib2.urlopen(req)

这里的问题是我的 'fq' 键有两个值,所以只处理一个参数。解决此问题的最简单方法是什么?

urlencode 将接受产生二元组的序列。

Convert a mapping object or a sequence of two-element tuples to a “percent-encoded” string. ...

例如

query_args = [
    ('q', '*:*'),
    ('fq', 'time:[2012-08-01T00:00:00Z TO 2013-10-01T00:00:00Z]'),
    ('fq', 'loc:[15,-45 TO 30,-30]'),
    ('rows', '0'),
]

演示:

>>> urllib.urlencode(query_args)
'q=%2A%3A%2A&fq=time%3A%5B2012-08-01T00%3A00%3A00Z+TO+2013-10-01T00%3A00%3A00Z%5D&fq=loc%3A%5B15%2C-45+TO+30%2C-30%5D&rows=0'

请注意,如果出于某种原因查询参数的 order 很重要,这也是您要使用的。