Skip to main content
 首页 » 编程设计

python之使用查询选项为 CouchDB 编码 curl-ready URL

2025年05月04日11leader

我正在使用 couchdb-python访问我的 CouchDB 后端。有时我想知道库正在访问的 URL,以便使用 curl 或任何其他工具来访问完全相同的 URL。也就是说,我希望能够复制/粘贴编码后的 URL 并执行 curl 访问,无需手动编辑任何内容。

由于 couchdb-python 没有给我这个信息,我构建了一个小工具来获取 URL:

import urllib 
 
def get_couchdb_url(server, database, design_doc, view_name, **options): 
    prefix = 'http://%s:%d' % (server, 5984) 
    url = '/'.join([prefix, database, "_design", design_doc, '_view', view_name]) 
    params = urllib.urlencode(options) 
    if params != "" : url += "?" + params 
    return url 
 
number='+666666666' 
print get_couchdb_url('localhost', 'phonenumbers', 'control', 'allgeonums', key = number) 

这给了我以下 URL:

http://localhost:5984/phonenumbers/_design/control/_view/allgeonums?key=%2B666666666 

如果我使用 curl 访问,会给出:

curl -X GET 'http://localhost:5984/phonenumbers/_design/control/_view/allgeonums?key=%2B666666666' 
{"error":"bad_request","reason":"invalid_json"} 

如果我手动编辑 URL,在键值前后添加 %22,CouchDB 会接受它并给我正确的答案:

curl -X GET 'http://localhost:5984/phonenumbers/_design/control/_view/allgeonums?key=%22%2B666666666%22' 

现在我有两个问题:

  • couchdb-python 可以显示它正在访问的 URL 吗?
  • 如何让 urllib.urlencode 生成 CouchDB 可以接受的编码数据?根据manual ,这些值必须经过 url 编码。对于一般情况,我不确定该怎么做。我想避免为这个简单的问题阅读 couchdb-python 源代码。

请您参考如下方法:

当然可以,而且非常简单,但要使用一些内部结构:

import couchdb 
from couchdb.http import urljoin 
from couchdb.client import _encode_view_options 
server = couchdb.Server() 
db = server['blog'] 
res = db.view('posts/by_author', key='Mike', reduce=False, include_docs=True) 
print urljoin(res.view.resource.url, **_encode_view_options(res.options)) 

会给你输出:

http://localhost:5984/blog/_design/posts/_view/by_author?key=%22Mike%22&reduce=false&include_docs=true

_encode_view_options唯一需要为 key、startkey 和 endkey 参数强制执行 JSON 值,并以相同的方式对任何非字符串参数进行编码。如果由于某些原因无法导入私有(private)函数,您可以自己实现此功能。