def send_response(self, code=200, body="", headers={}): resp = { 'code': code, 'body': body, 'headers': headers } self.write(json.dumps(resp))
def encode_params(params): """ encode parameters in json if needed """ _params = {} if params: for name, value in params.items(): if value is None: continue if name in ('key', 'startkey', 'endkey') \ or not isinstance(value, basestring): value = json.dumps(value) _params[name] = value return _params
def copy_doc(self, doc, dest=None, _raw_json=False): """ copy an existing document to a new id. If dest is None, a new uuid will be requested @param doc: dict or string, document or document id @param dest: basestring or dict. if _rev is specified in dict it will override the doc @param _raw_json: return raw json instead deserializing it """ if isinstance(doc, basestring): docid = doc else: if not '_id' in doc: raise KeyError('_id is required to copy a doc') docid = doc['_id'] if dest is None: destination = self.server.next_uuid(count=1) elif isinstance(dest, basestring): if dest in self: dest = self.get(dest)['_rev'] destination = "%s?rev=%s" % (dest['_id'], dest['_rev']) else: destination = dest elif isinstance(dest, dict): if '_id' in dest and '_rev' in dest and dest['_id'] in self: rev = dest['_rev'] destination = "%s?rev=%s" % (dest['_id'], dest['_rev']) else: raise KeyError("dest doesn't exist or this not a document ('_id' or '_rev' missig).") if destination: result = maybe_raw(self.res.copy('/%s' % docid, headers={ "Destination": str(destination) }), raw=_raw_json) return result result = { 'ok': False } if _raw_json: return json.dumps(result) return result
library = doc count = len(fields) include_to = included for i, field in enumerate(fields): if not field in library: logger.warning( "process json macro: unknown json source: %s" % mo.group(2)) break library = library[field] if i+1 < count: include_to[field] = include_to.get(field, {}) include_to = include_to[field] else: include_to[field] = library return f_string def rjson2(mo): return '\n'.join(varstrings) re_json = re.compile('(\/\/|#)\ ?!json (.*)') re_json.sub(rjson, f_string) if not included: return f_string for k, v in included.iteritems(): varstrings.append("var %s = %s;" % (k, json.dumps(v).encode('utf-8'))) return re_json.sub(rjson2, f_string)
sys.exit(-1) else: fields = mo.group(2).split('.') library = doc count = len(fields) include_to = included for i, field in enumerate(fields): if not field in library: break library = library[field] if i+1 < count: include_to[field] = include_to.get(field, {}) include_to = include_to[field] else: include_to[field] = library return f_string def rjson2(mo): return '\n'.join(varstrings) re_json = re.compile('(\/\/|#)\ ?!json (.*)') re_json.sub(rjson, f_string) if not included: return f_string for k, v in included.iteritems(): varstrings.append("var %s = %s;" % (k, json.dumps(v))) return re_json.sub(rjson2, f_string)
def request(self, method, path=None, payload=None, headers=None, **params): """ Perform HTTP call to the couchdb server and manage JSON conversions, support GET, POST, PUT and DELETE. Usage example, get infos of a couchdb server on http://127.0.0.1:5984 : import couchdbkit.CouchdbResource resource = couchdbkit.CouchdbResource() infos = resource.request('GET') @param method: str, the HTTP action to be performed: 'GET', 'HEAD', 'POST', 'PUT', or 'DELETE' @param path: str or list, path to add to the uri @param data: str or string or any object that could be converted to JSON. @param headers: dict, optional headers that will be added to HTTP request. @param raw: boolean, response return a Response object @param params: Optional parameterss added to the request. Parameterss are for example the parameters for a view. See `CouchDB View API reference <http://wiki.apache.org/couchdb/HTTP_view_API>`_ for example. @return: tuple (data, resp), where resp is an `httplib2.Response` object and data a python object (often a dict). """ headers = headers or {} headers.setdefault('Accept', 'application/json') headers.setdefault('User-Agent', USER_AGENT) if payload is not None: #TODO: handle case we want to put in payload json file. if not hasattr(payload, 'read') and not isinstance(payload, basestring): payload = json.dumps(payload).encode('utf-8') headers.setdefault('Content-Type', 'application/json') params = encode_params(params) try: resp = Resource.request(self, method, path=path, payload=payload, headers=headers, **params) except ResourceError, e: msg = getattr(e, 'msg', '') if e.response and msg: if e.response.headers.get('content-type') == 'application/json': try: msg = json.loads(msg) except ValueError: pass if type(msg) is dict: error = msg.get('reason') else: error = msg if e.status_int == 404: raise ResourceNotFound(error, http_code=404, response=e.response) elif e.status_int == 409: raise ResourceConflict(error, http_code=409, response=e.response) elif e.status_int == 412: raise PreconditionFailed(error, http_code=412, response=e.response) else: raise