aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexis Metaireau <alexis@notmyidea.org>2011-09-13 11:52:11 +0200
committerAlexis Metaireau <alexis@notmyidea.org>2011-09-13 11:52:11 +0200
commita60b0c2b48540729df64c71bf82ff1238811e11d (patch)
tree1c710beacc500f4405aabf1a78a82c2ff5b17efa
parentd2e2260e522cf4b7de24dbb2adbb3bfb12ee01f3 (diff)
downloadihatemoney-mirror-a60b0c2b48540729df64c71bf82ff1238811e11d.zip
ihatemoney-mirror-a60b0c2b48540729df64c71bf82ff1238811e11d.tar.gz
ihatemoney-mirror-a60b0c2b48540729df64c71bf82ff1238811e11d.tar.bz2
add mimetype support to the rest API utils
-rw-r--r--budget/rest.py36
1 files changed, 18 insertions, 18 deletions
diff --git a/budget/rest.py b/budget/rest.py
index 3a911ab..a61f02c 100644
--- a/budget/rest.py
+++ b/budget/rest.py
@@ -1,4 +1,5 @@
import json
+from flask import request
class RESTResource(object):
"""Represents a REST resource, with the different HTTP verbs"""
@@ -23,14 +24,14 @@ class RESTResource(object):
:app:
Application to register the routes onto
- :actions:
+ :actions:
Authorized actions. Optional. None means all.
:handler:
The handler instance which will handle the requests
:authentifier:
- callable checking the authentication. If specified, all the
+ callable checking the authentication. If specified, all the
methods will be checked against it.
"""
if not actions:
@@ -45,12 +46,12 @@ class RESTResource(object):
for action in actions:
self.add_url_rule(app, action)
-
+
def _get_route_for(self, action):
"""Return the complete URL for this action.
Basically:
-
+
- get, update and delete need an id
- add and list does not
"""
@@ -58,22 +59,21 @@ class RESTResource(object):
if action in self._NEED_ID:
route += "/<%s>" % self._identifier
-
+
return route
def add_url_rule(self, app, action):
- """Registers a new url to the given application, regarding
+ """Registers a new url to the given application, regarding
the action.
"""
method = getattr(self._handler, action)
# decorate the view
if self._authentifier:
- method = need_auth(self._authentifier,
+ method = need_auth(self._authentifier,
self._inject_name or self._name)(method)
- # regarding the format, transform the response
- method = serialize("json")(method) #FIXME handle headers
+ method = serialize(method)
app.add_url_rule(
self._get_route_for(action),
@@ -83,7 +83,7 @@ class RESTResource(object):
def need_auth(authentifier, name=None, remove_attr=True):
- """Decorator checking that the authentifier does not returns false in
+ """Decorator checking that the authentifier does not returns false in
the current context.
If the request is authorized, the object returned by the authentifier
@@ -100,7 +100,7 @@ def need_auth(authentifier, name=None, remove_attr=True):
of the decorated function
:remove_attr:
- Remove or not the `*name*_id` from the kwargs before calling the
+ Remove or not the `*name*_id` from the kwargs before calling the
function
"""
def wrapper(func):
@@ -120,12 +120,12 @@ def need_auth(authentifier, name=None, remove_attr=True):
# serializers
-def serialize(format):
- def wrapper(func):
- def wrapped(*args, **kwargs):
- return SERIALIZERS[format].encode(func(*args, **kwargs))
- return wrapped
- return wrapper
+def serialize(func):
+ def wrapped(*args, **kwargs):
+ mime = request.accept_mimetypes.best_match(SERIALIZERS.keys())
+ return SERIALIZERS.get(mime, "text/json")\
+ .encode(func(*args, **kwargs))
+ return wrapped
class JSONEncoder(json.JSONEncoder):
@@ -139,4 +139,4 @@ class JSONEncoder(json.JSONEncoder):
else:
return json.JSONEncoder.default(self, o)
-SERIALIZERS = {"json": JSONEncoder()}
+SERIALIZERS = {"text/json": JSONEncoder()}