def collections_endpoint(url): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = config.RESOURCES[url] response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def item_endpoint(**lookup): """ Item endpoint handler :param url: the url that led here :param lookup: the query .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.1.0 Support for PUT method. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests """ k = request.path.rstrip('/').rfind('/') resource = config.RESOURCES[request.path[:k]] response = None method = request_method() if method in ('GET', 'HEAD'): response = getitem(resource, **lookup) elif method == 'PATCH': response = patch(resource, **lookup) elif method == 'PUT': response = put(resource, **lookup) elif method == 'DELETE': response = delete(resource, **lookup) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def decorated(*args, **kwargs): method = request_method() event_name = 'on_pre_' + method resource = args[0] if args else None gh_params = () rh_params = () if method in ('GET', 'PATCH', 'DELETE', 'PUT'): gh_params = (resource, request, kwargs) rh_params = (request, kwargs) elif method in ('POST'): # POST hook does not support the kwargs argument gh_params = (resource, request) rh_params = (request, ) # general hook getattr(app, event_name)(*gh_params) if resource: # resource hook getattr(app, event_name + '_' + resource)(*rh_params) combined_args = kwargs if len(args) > 1: combined_args.update(args[1].items()) r = f(resource, **combined_args) return r
def collections_endpoint(url): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = config.RESOURCES[url] response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) else: abort(405) return send_response(resource, response)
def xml_collections_endpoint(**lookup): resource = _resource() response = None method = request_method() if request.content_type.endswith("/xml"): if method == "POST": # response = post(resource, payl=xml2json(request.data)) response = post_internal(resource, payl=xml2json(request.data), skip_validation=True) elif method == "GET": response = collections_endpoint(**lookup) l = json.loads(response.data.decode('utf-8'))['_items'] response.data = xmltodict.unparse({ 'gdxp': { "supplier": list(map(popper, l)) } }) else: raise NotImplementedError('Not implemented') return send_response(resource, response) else: return collections_endpoint(**lookup)
def decorated(*args, **kwargs): method = request_method() if method == 'HEAD': method = 'GET' event_name = 'on_pre_' + method resource = args[0] if args else None gh_params = () rh_params = () if method in ('GET', 'PATCH', 'DELETE', 'PUT'): gh_params = (resource, request, kwargs) rh_params = (request, kwargs) elif method in ('POST', ): # POST hook does not support the kwargs argument gh_params = (resource, request) rh_params = (request,) # general hook getattr(app, event_name)(*gh_params) if resource: # resource hook getattr(app, event_name + '_' + resource)(*rh_params) combined_args = kwargs if len(args) > 1: combined_args.update(args[1].items()) r = f(resource, **combined_args) return r
def collections_endpoint(): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ url = request.path.rstrip('/') resource = config.RESOURCES[url] response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def item_endpoint(url, **lookup): """ Item endpoint handler :param url: the url that led here :param lookup: the query .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests """ resource = config.RESOURCES[url] response = None method = request_method() if method in ('GET', 'HEAD'): response = getitem(resource, **lookup) elif method == 'PATCH': response = patch(resource, **lookup) elif method == 'DELETE': response = delete(resource, **lookup) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def collections_endpoint(**lookup): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.2 Relying on request.endpoint to retrieve the resource being consumed. .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = _resource() response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource, lookup) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete_resource(resource) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def decorated(*args, **kwargs): r = f(*args, **kwargs) method = request_method() if method in ('GET', 'POST', 'PATCH', 'DELETE'): event_name = 'on_' + method.lower() resource = args[0] if args else None # general hook getattr(app, event_name)(resource, request, r) if resource: # resource hook getattr(app, event_name + '_' + resource)(request, r) return r
def decorated(*args, **kwargs): r = f(*args, **kwargs) method = request_method() if method in ("GET", "POST", "PATCH", "DELETE", "PUT"): event_name = "on_post_" + method resource = args[0] if args else None # general hook getattr(app, event_name)(resource, request, r) if resource: # resource hook getattr(app, event_name + "_" + resource)(request, r) return r
def resolve_default_values(document, resource): """ Add any defined default value for missing document fields. :param document: the document being posted or replaced :param resource: the resource to which the document belongs .. versionadded:: 0.2 """ if request_method() in ('POST', 'PUT'): defaults = app.config['DOMAIN'][resource]['defaults'] missing_defaults = defaults.difference(set(document.keys())) schema = config.DOMAIN[resource]['schema'] for missing_field in missing_defaults: document[missing_field] = schema[missing_field]['default']
def wrapper(*args, **kwargs): # If the request is XML or JSON, return the Eve endpoint if request_is_xml() or request_is_json(): return eve_view_func[request_type](*args, **kwargs) # If the request is for the `item` or `resource` endpoints, get # the resource name and method and feed them to the HTML renderer if request_type == 'item' or request_type == 'resource': resource = _resource() method = request_method() return wrapper_func(resource, method, **kwargs) # For all other endpoints, return the HTML renderer return wrapper_func(*args, **kwargs)
def parse(value, resource): """ Safely evaluates a string containing a Python expression. We are receiving json and returning a dict. :param value: the string to be evaluated. :param resource: name of the involved resource. .. versionchanged:: 0.1.1 Serialize data-specific values as needed. .. versionchanged:: 0.1.0 Support for PUT method. .. versionchanged:: 0.0.5 Support for 'application/json' Content-Type. .. versionchanged:: 0.0.4 When parsing POST requests, eventual default values are injected in parsed documents. """ try: # assume it's not decoded to json yet (request Content-Type = form) document = json.loads(value) except: # already a json document = value # if needed, get field values serialized by the data diver being used. # If any error occurs, assume validation will take care of it (i.e. a badly # formatted objectid). try: document = serialize(document, resource) except: pass # update the document with eventual default values if request_method() in ('POST', 'PUT'): defaults = app.config['DOMAIN'][resource]['defaults'] missing_defaults = defaults.difference(set(document.keys())) schema = config.DOMAIN[resource]['schema'] for missing_field in missing_defaults: document[missing_field] = schema[missing_field]['default'] return document
def rate_limited(*args, **kwargs): method_limit = app.config.get('RATE_LIMIT_' + request_method()) if method_limit and app.redis: limit = method_limit[0] period = method_limit[1] # If authorization is being used the key is 'username'. # Else, fallback to client IP. key = 'rate-limit/%s' % (request.authorization.username if request.authorization else request.remote_addr) rlimit = RateLimit(key, limit, period, True) if rlimit.over_limit: return Response('Rate limit exceeded', 429) # store the rate limit for further processing by # send_response g._rate_limit = rlimit else: g._rate_limit = None return f(*args, **kwargs)
def collections_endpoint(**lookup): """ Resource endpoint handler :param url: the url that led here .. versionchanged:: 0.3 Pass lookup query down to delete_resource, so it can properly process sub-resources. .. versionchanged:: 0.2 Relying on request.endpoint to retrieve the resource being consumed. .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests .. versionchanged:: 0.0.2 Support for DELETE resource method. """ resource = _resource() response = None method = request_method() if method in ('GET', 'HEAD'): response = get(resource, lookup) elif method == 'POST': response = post(resource) elif method == 'DELETE': response = delete(resource, lookup) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def item_endpoint(**lookup): """ Item endpoint handler :param url: the url that led here :param lookup: sub resource query .. versionchanged:: 0.2 Support for sub-resources. Relying on request.endpoint to retrieve the resource being consumed. .. versionchanged:: 0.1.1 Relying on request.path for determining the current endpoint url. .. versionchanged:: 0.1.0 Support for PUT method. .. versionchanged:: 0.0.7 Using 'utils.request_method' helper function now. .. versionchanged:: 0.0.6 Support for HEAD requests """ resource = _resource() response = None method = request_method() if method in ('GET', 'HEAD'): response = getitem(resource, **lookup) elif method == 'PATCH': response = patch(resource, **lookup) elif method == 'PUT': response = put(resource, **lookup) elif method == 'DELETE': response = deleteitem(resource, **lookup) elif method == 'OPTIONS': send_response(resource, response) else: abort(405) return send_response(resource, response)
def xml_collections_endpoint(**lookup): resource = _resource() response = None method = request_method() if request.content_type.endswith("/xml"): if method == "POST": # response = post(resource, payl=xml2json(request.data)) response = post_internal(resource, payl=xml2json(request.data), skip_validation=True) elif method == "GET": response = collections_endpoint(**lookup) l = json.loads(response.data.decode('utf-8'))['_items'] response.data = xmltodict.unparse( {'gdxp': { "supplier": list(map(popper, l)) }}) else: raise NotImplementedError('Not implemented') return send_response(resource, response) else: return collections_endpoint(**lookup)