我正在使用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 -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能给我看它正在访问的网址吗?couchdb-python源代码。发布于 2012-11-27 20:02:52
当然可以,而且非常简单,但是使用一些内部部件:
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值,并以任何非字符串参数的方式对其进行编码。如果由于某些原因无法导入私有函数,您可以自己实现该函数。
发布于 2012-11-27 21:06:41
似乎查询选项中的值必须首先转换为json,然后才能进行url编码。我想出了以下代码:
import simplejson as json
import urllib
def json_encode_options(**options):
json_options = { }
for k, v in options.iteritems():
v_encoded = json.dumps(v)
json_options[k] = v_encoded
return urllib.urlencode(json_options)
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 = json_encode_options(**options)
if params != "" : url += "?" + params
return url
number='+666666666'
print get_couchdb_url('localhost', 'phonenumbers', 'control', 'allgeonums', key = number)https://stackoverflow.com/questions/13588516
复制相似问题