CouchDB urlencode Python

2024-09-23 16:31:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题是,我必须对dict进行编码才能设计couchdb:

我有一句话:

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

我想要这样的网址:

^{pr2}$

或者像这样:

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需要startkeyendkey中的双引号

如果我把口述改成:

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

这个返回一个有效的URL,如下所示:

^{pr2}$

但是我不想在单引号内传递双引号,有没有一种方法可以返回一个有效的URL?在

谢谢你的回答:D


Tags: truelocalhosthttpurlhelloworldparamsdict
3条回答

我建议您编写自己的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 $
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。在

查询字符串中不允许使用双引号,因此最好使用:

^{pr2}$

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的值改为一个boolean True,因为您需要一个JSON booleantrue,而不是字符串{}。在

(这里现有的答案假设字符串,而不是URL encodeJSON encode,因此对于任何JSON特殊字符或URL特殊字符、任何非ASCII或非字符串数据类型,都将失败。)

相关问题 更多 >