我正在使用 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)函数,您可以自己实现此功能。
关于python - 使用查询选项为 CouchDB 编码 curl-ready URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13588516/