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

标签 python couchdb couchdb-python

我正在使用 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唯一需要为 keystartkeyendkey 参数强制执行 JSON 值,并以相同的方式对任何非字符串参数进行编码。如果由于某些原因无法导入私有(private)函数,您可以自己实现此功能。

关于python - 使用查询选项为 CouchDB 编码 curl-ready URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588516/

相关文章:

python - couchdb-python 和 map 函数 ViewField 执行

python - BeautifulSoup 获得标签.id

couchdb - 使用 couchdb 进行每用户数据库复制

php - 为 CouchDB 减少 PHPillow 中的函数

r - 从 R 创建 CouchDB 设计文档

python - 如何使用 python 更改 couchdb 数据库的权限

python - 使用 Python 在 Windows Server 2012 上远程编辑文件

python - 使用 BeautifulSoup 获取两个 h2 标题之间的文本

python - 为什么我不能从打包程序构建中运行 "source"命令?