summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2015-04-06 06:44:14 -0400
committerChris McDonough <chrism@plope.com>2015-04-06 06:44:14 -0400
commit17c7f4091a3e747fb215328803462ff14de556d2 (patch)
tree5c976ef17dbbeb64a94c28d09b8ad66a5f73ac09
parent2a842e615d5f36b4dfb26e843de7d73147e546f8 (diff)
downloadpyramid-17c7f4091a3e747fb215328803462ff14de556d2.tar.gz
pyramid-17c7f4091a3e747fb215328803462ff14de556d2.tar.bz2
pyramid-17c7f4091a3e747fb215328803462ff14de556d2.zip
change excview_tween to use _call_view instead of adapters.lookup; parameterize _call_view and _find_views to cope
-rw-r--r--pyramid/tweens.py17
-rw-r--r--pyramid/view.py26
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