我的问题是,我必须编码一个字典来进行couchdb设计:
我有这样一句话:
params = {'descending': 'true', 'startkey': 'Mexico', 'endkey': 'Mexico'}我想要一个这样的URL:
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=%22Mexico%22&endkey=%22Mexico%22或者像这样:
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey="Mexico"&endkey="Mexico"因此,我使用urllib.urlencode将字典转换为查询字符串:
urllib.urlencode(params)这个函数返回的内容类似于:
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=Mexico&endkey=Mexico因此,这是一个无效的CouchDB地址,因为CouchDB需要在startkey和endkey中使用双引号
如果我把我的判决书改成这样:
params = {'descending': 'true', 'startkey': '"Mexico"', 'endkey': '"Mexico"'}这将返回一个有效的URL,如下所示:
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=%22Mexico%22&endkey=%22Mexico%22但是我不想在单引号中传递双引号,有没有方法可以返回一个有效的URL?
感谢您的回答:D
发布于 2013-06-24 06:14:01
Couch参数值是JSON文字,因此应该通过对值进行JSON编码来创建。然后,您还需要对结果进行URL编码,以适合标准URL。
示例:
import urllib, json
def to_json_query(params):
return urllib.urlencode({p: json.dumps(params[p]) for p in params})
>>> qs = to_json_query({'descending': True, 'startkey': 'Mexico', 'endkey': 'Mexico'})
'startkey=%22Mexico%22&endkey=%22Mexico%22&descending=%22true%22'注意,我已经将descending的值更改为布尔型True,因为您需要的是JSON布尔型true,而不是字符串"true"。
(这里的现有答案假定为字符串,并且没有URL编码或JSON编码,因此对于任何JSON特殊字符或URL特殊字符、任何非ASCII或非字符串数据类型都将失败。)
发布于 2013-06-24 04:34:27
我建议您编写自己的urlencode函数。下面是一个基本的例子:
params = {"startkey":"Mexico","endkey":"Mexico"}
def myencode(params):
return "&".join(['%s="%s"' %(key,value) for key,value in params.iteritems()])
print myencode(params)
## chaouche@karabeela ~/CODE/TEST/PYTHON $ python test_exec_minimal2.py
## startkey="Mexico"&endkey="Mexico"
## chaouche@karabeela ~/CODE/TEST/PYTHON $发布于 2013-06-24 04:26:25
params = {'descending': 'true', 'startkey': 'Mexico', 'endkey': 'Mexico'}
pairs = ['{}="{}"'.format(k,v) for k,v in params.items()]
print '&'.join(pairs);
--output:--
startkey="Mexico"&endkey="Mexico"&descending="true"如果你不想引用true,那么在for循环中做同样的事情,不要引用true。
查询字符串中不允许使用双引号,因此最好使用:
pairs = ['{}=%22{}%22'.format(k,v) for k,v in params.items()]https://stackoverflow.com/questions/17264883
复制相似问题