1

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

我有这个字典:

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 需要在startkeyendkey

如果我将我的 dict 更改为:

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

4

3 回答 3

2

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'

请注意,我已将 的值更改为descendingboolean True,因为您需要 JSON booleantrue而不是 string "true"

(这里的现有答案假定字符串并且不进行 URL 编码JSON 编码,因此对于任何 JSON 特殊或 URL 特殊字符、任何非 ASCII 或非字符串数据类型都将失败。)

于 2013-06-23T22:14:00.730 回答
1

我建议编写自己的 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-23T20:34:26.817 回答
0
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()]
于 2013-06-23T20:26:24.767 回答