diff options
| author | Antony Lesuisse <al@openerp.com> | 2012-10-23 16:14:41 +0200 |
|---|---|---|
| committer | Antony Lesuisse <al@openerp.com> | 2012-10-23 16:14:41 +0200 |
| commit | 9155f0318ec5a180d43449d9f8c5aac58fe8b25b (patch) | |
| tree | 28d9664520e5e9b8f191ac3ac86aaf95894016eb /addons/web/http.py | |
| parent | d559db9aec707e77cfbea4a993ea0c0cf2c1e5b2 (diff) | |
[IMP] http dispatching decorators
bzr revid: al@openerp.com-20121023141441-5yc5gso95tl1p157
Diffstat (limited to 'addons/web/http.py')
| -rw-r--r-- | addons/web/http.py | 46 |
1 files changed, 22 insertions, 24 deletions
diff --git a/addons/web/http.py b/addons/web/http.py index 65630768737..1a636971fb5 100644 --- a/addons/web/http.py +++ b/addons/web/http.py @@ -128,10 +128,9 @@ class JsonRequest(WebRequest): "id": null} """ - def dispatch(self, controller, method): + def dispatch(self, method): """ Calls the method asked for by the JSON-RPC2 or JSONP request - :param controller: the instance of the controller which received the request :param method: the method which received the request :returns: an utf8 encoded JSON-RPC2 or JSONP reply @@ -170,9 +169,9 @@ class JsonRequest(WebRequest): self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder) self.init(self.jsonrequest.get("params", {})) if _logger.isEnabledFor(logging.DEBUG): - _logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest)) + _logger.debug("--> %s.%s\n%s", method.im_class.__name__, method.__name__, pprint.pformat(self.jsonrequest)) response['id'] = self.jsonrequest.get('id') - response["result"] = method(controller, self, **self.params) + response["result"] = method(self, **self.params) except session.AuthenticationError: error = { 'code': 100, @@ -230,16 +229,13 @@ def jsonrequest(f): the ``session_id``, ``context`` and ``debug`` keys (which are stripped out beforehand) """ - @functools.wraps(f) - def json_handler(controller, request): - return JsonRequest(request).dispatch(controller, f) - json_handler.exposed = True - return json_handler + f.exposed = 'json' + return f class HttpRequest(WebRequest): """ Regular GET/POST request """ - def dispatch(self, controller, method): + def dispatch(self, method): params = dict(self.httprequest.args) params.update(self.httprequest.form) params.update(self.httprequest.files) @@ -250,9 +246,9 @@ class HttpRequest(WebRequest): akw[key] = value else: akw[key] = type(value) - _logger.debug("%s --> %s.%s %r", self.httprequest.method, controller.__class__.__name__, method.__name__, akw) + _logger.debug("%s --> %s.%s %r", self.httprequest.method, method.im_class.__name__, method.__name__, akw) try: - r = method(controller, self, **self.params) + r = method(self, **self.params) except xmlrpclib.Fault, e: r = werkzeug.exceptions.InternalServerError(cgi.escape(simplejson.dumps({ 'code': 200, @@ -317,11 +313,8 @@ def httprequest(f): merged in the same dictionary), apart from the ``session_id``, ``context`` and ``debug`` keys (which are stripped out beforehand) """ - @functools.wraps(f) - def http_handler(controller, request): - return HttpRequest(request).dispatch(controller, f) - http_handler.exposed = True - return http_handler + f.exposed = 'http' + return f #---------------------------------------------------------- # Controller registration with a metaclass @@ -538,16 +531,21 @@ class Root(object): """ if l: ps = '/' + '/'.join(l) - meth = 'index' + method_name = 'index' while ps: c = controllers_path.get(ps) if c: - m = getattr(c, meth, None) - if m and getattr(m, 'exposed', False): - _logger.debug("Dispatching to %s %s %s", ps, c, meth) - return m - ps, _slash, meth = ps.rpartition('/') - if not ps and meth: + method = getattr(c, method_name, None) + if method: + exposed = getattr(method, 'exposed', False) + if exposed == 'json': + _logger.debug("Dispatch json to %s %s %s", ps, c, method_name) + return lambda request: JsonRequest(request).dispatch(method) + elif exposed == 'http': + _logger.debug("Dispatch http to %s %s %s", ps, c, method_name) + return lambda request: HttpRequest(request).dispatch(method) + ps, _slash, method_name = ps.rpartition('/') + if not ps and method_name: ps = '/' return None |
