From 17c7f4091a3e747fb215328803462ff14de556d2 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 6 Apr 2015 06:44:14 -0400 Subject: change excview_tween to use _call_view instead of adapters.lookup; parameterize _call_view and _find_views to cope --- pyramid/tweens.py | 17 +++++++++++------ pyramid/view.py | 26 ++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/pyramid/tweens.py b/pyramid/tweens.py index 831de8481..d6044dcdc 100644 --- a/pyramid/tweens.py +++ b/pyramid/tweens.py @@ -3,17 +3,16 @@ import sys from pyramid.interfaces import ( IExceptionViewClassifier, IRequest, - IView, ) from zope.interface import providedBy +from pyramid.view import _call_view def excview_tween_factory(handler, registry): """ A :term:`tween` factory which produces a tween that catches an exception raised by downstream tweens (or the main Pyramid request handler) and, if possible, converts it into a Response using an :term:`exception view`.""" - adapters = registry.adapters def excview_tween(request): attrs = request.__dict__ @@ -39,11 +38,17 @@ def excview_tween_factory(handler, registry): # https://github.com/Pylons/pyramid/issues/700 request_iface = attrs.get('request_iface', IRequest) provides = providedBy(exc) - for_ = (IExceptionViewClassifier, request_iface.combined, provides) - view_callable = adapters.lookup(for_, IView, default=None) - if view_callable is None: + response = _call_view( + registry, + request, + exc, + provides, + '', + view_classifier=IExceptionViewClassifier, + request_iface=request_iface.combined + ) + if response is None: raise - response = view_callable(exc, request) return response diff --git a/pyramid/view.py b/pyramid/view.py index 1ea4e3b47..ffa3fa791 100644 --- a/pyramid/view.py +++ b/pyramid/view.py @@ -9,6 +9,7 @@ from pyramid.interfaces import ( ISecuredView, IView, IViewClassifier, + IRequest, ) from pyramid.compat import decode_path_info @@ -416,17 +417,27 @@ class forbidden_view_config(object): settings['_info'] = info.codeinfo # fbo "action_method" return wrapped -def _find_views(registry, request_iface, context_iface, view_name): +def _find_views( + registry, + request_iface, + context_iface, + view_name, + view_types=None, + view_classifier=None, + ): + if view_types is None: + view_types = (IView, ISecuredView, IMultiView) + if view_classifier is None: + view_classifier = IViewClassifier registered = registry.adapters.registered cache = registry._view_lookup_cache views = cache.get((request_iface, context_iface, view_name)) if views is None: views = [] - view_types = (IView, ISecuredView, IMultiView) for req_type, ctx_type in itertools.product( request_iface.__sro__, context_iface.__sro__ ): - source_ifaces = (IViewClassifier, req_type, ctx_type) + source_ifaces = (view_classifier, req_type, ctx_type) for view_type in view_types: view_callable = registered( source_ifaces, @@ -453,13 +464,20 @@ def _call_view( context, context_iface, view_name, + view_types=None, + view_classifier=None, secure=True, + request_iface=None, ): + if request_iface is None: + request_iface = getattr(request, 'request_iface', IRequest) view_callables = _find_views( registry, - request.request_iface, + request_iface, context_iface, view_name, + view_types=view_types, + view_classifier=view_classifier, ) pme = None -- cgit v1.2.3