首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CouchDB urlencode Python

CouchDB urlencode Python
EN

Stack Overflow用户
提问于 2013-06-24 04:15:16
回答 3查看 436关注 0票数 1

我的问题是,我必须编码一个字典来进行couchdb设计:

我有这样一句话:

代码语言:javascript
复制
params = {'descending': 'true', 'startkey': 'Mexico', 'endkey': 'Mexico'}

我想要一个这样的URL:

代码语言:javascript
复制
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=%22Mexico%22&endkey=%22Mexico%22

或者像这样:

代码语言:javascript
复制
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey="Mexico"&endkey="Mexico"

因此,我使用urllib.urlencode将字典转换为查询字符串:

代码语言:javascript
复制
urllib.urlencode(params)

这个函数返回的内容类似于:

代码语言:javascript
复制
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=Mexico&endkey=Mexico

因此,这是一个无效的CouchDB地址,因为CouchDB需要在startkeyendkey中使用双引号

如果我把我的判决书改成这样:

代码语言:javascript
复制
params = {'descending': 'true', 'startkey': '"Mexico"', 'endkey': '"Mexico"'}

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

代码语言:javascript
复制
http://localhost:5984/hello-world/_design/precios/_view/precios?descending=true&startkey=%22Mexico%22&endkey=%22Mexico%22

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

感谢您的回答:D

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-24 06:14:01

Couch参数值是JSON文字,因此应该通过对值进行JSON编码来创建。然后,您还需要对结果进行URL编码,以适合标准URL。

示例:

代码语言:javascript
复制
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或非字符串数据类型都将失败。)

票数 2
EN

Stack Overflow用户

发布于 2013-06-24 04:34:27

我建议您编写自己的urlencode函数。下面是一个基本的例子:

代码语言:javascript
复制
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 $
票数 1
EN

Stack Overflow用户

发布于 2013-06-24 04:26:25

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
pairs = ['{}=%22{}%22'.format(k,v) for k,v in params.items()]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17264883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档