首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用查询选项编码CouchDB的curl

用查询选项编码CouchDB的curl
EN

Stack Overflow用户
提问于 2012-11-27 16:20:45
回答 2查看 863关注 0票数 2

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

由于couchdb-python没有提供这些信息,所以我构建了一个获取URL的小工具:

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

代码语言:javascript
复制
http://localhost:5984/phonenumbers/_design/control/_view/allgeonums?key=%2B666666666

如果我用卷发访问它,会给出:

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

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

代码语言:javascript
复制
curl -X GET 'http://localhost:5984/phonenumbers/_design/control/_view/allgeonums?key=%22%2B666666666%22'

现在我有两个问题:

  • couchdb-python能给我看它正在访问的网址吗?
  • 如何让urllib.urlencode生成可被CouchDB接受的编码数据?根据手册,必须对值进行url编码。就一般情况而言,我不知道该如何做。为了解决这个简单的问题,我想避免阅读couchdb-python源代码。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-27 20:02:52

当然可以,而且非常简单,但是使用一些内部部件:

代码语言:javascript
复制
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值,并以任何非字符串参数的方式对其进行编码。如果由于某些原因无法导入私有函数,您可以自己实现该函数。

票数 1
EN

Stack Overflow用户

发布于 2012-11-27 21:06:41

似乎查询选项中的值必须首先转换为json,然后才能进行url编码。我想出了以下代码:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13588516

复制
相关文章

相似问题

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