From 070bfdbaa6f3cffbda3a0bfe86534e24ea01142c Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sat, 23 Jul 2011 01:11:41 -0400 Subject: first cut --- pyramid/request.py | 14 ++++++++++++++ pyramid/router.py | 8 ++++++++ 2 files changed, 22 insertions(+) diff --git a/pyramid/request.py b/pyramid/request.py index 8df204681..605b4b061 100644 --- a/pyramid/request.py +++ b/pyramid/request.py @@ -203,6 +203,7 @@ class Request(BaseRequest, DeprecatedRequestMethods): implements(IRequest) response_callbacks = () finished_callbacks = () + view_wrappers = () exception = None matchdict = None matched_route = None @@ -212,6 +213,19 @@ class Request(BaseRequest, DeprecatedRequestMethods): """ Template context (for Pylons apps) """ return TemplateContext() + def add_view_wrapper(self, wrapper): + """ Add a view wrapper """ + wrappers = self.view_wrappers + if not wrappers: + wrappers = [] + wrappers.append(wrapper) + self.view_wrappers = wrappers + + def _wrap_view(self, view, is_exc_view=False): + for wrapper in self.view_wrappers: + view = wrapper(view, is_exc_view) + return view + def add_response_callback(self, callback): """ Add a callback to the set of callbacks to be called by the diff --git a/pyramid/router.py b/pyramid/router.py index 0a92b5cd5..b11ebc7eb 100644 --- a/pyramid/router.py +++ b/pyramid/router.py @@ -141,6 +141,11 @@ class Router(object): (IViewClassifier, request_iface, context_iface), IView, name=view_name, default=None) + # if there were any view wrappers set on the current + # request, use them to wrap the view + if request.view_wrappers: + view_callable = request._wrap_view(view_callable) + # invoke the view callable if view_callable is None: if self.debug_notfound: @@ -178,6 +183,9 @@ class Router(object): if view_callable is None: raise + if request.view_wrappers: + view_callable = request._wrap_view(view_callable, True) + response = view_callable(why, request) has_listeners and notify(NewResponse(request, response)) -- cgit v1.2.3