CouchDB urlencode Python

我的问题是,我必须编码一个字典才能进行Sofadb设计:

我有这个命令:

params = {'descending': 'true', 'startkey': 'Mexico', 'endkey': 'Mexico'}

我想要这样的网址:

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将dict转换为查询字符串:

urllib.urlencode(params)

这回给我类似的东西:

http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=Mexico&endkey=Mexico

因此,这对于CouchDB是无效的URL,因为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?


慕码人2483693
浏览 219回答 4
4回答

跃然一笑

Couch参数值是JSON文字,因此应通过对值进行JSON编码来创建。然后,您还需要对该结果进行URL编码以适合标准URL。例子:import urllib, jsondef 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或非字符串数据类型,都将失败。)

largeQ

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()]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python