diff options
| author | Michael Merickel <michael@merickel.org> | 2015-02-05 16:39:16 -0600 |
|---|---|---|
| committer | Michael Merickel <michael@merickel.org> | 2015-02-05 16:39:16 -0600 |
| commit | 85d801817e2137848a3ccb4303b88ace063a81d5 (patch) | |
| tree | 26534d74a26e833a5672add4ec340319041025ea | |
| parent | 686f03bab3df9e1527dce1b02bcca1b05fc74bf5 (diff) | |
| download | pyramid-85d801817e2137848a3ccb4303b88ace063a81d5.tar.gz pyramid-85d801817e2137848a3ccb4303b88ace063a81d5.tar.bz2 pyramid-85d801817e2137848a3ccb4303b88ace063a81d5.zip | |
provide a fix for view lookup fallbacks
| -rw-r--r-- | pyramid/router.py | 22 | ||||
| -rw-r--r-- | pyramid/view.py | 12 |
2 files changed, 22 insertions, 12 deletions
diff --git a/pyramid/router.py b/pyramid/router.py index ba4f85b18..5190311d2 100644 --- a/pyramid/router.py +++ b/pyramid/router.py @@ -27,6 +27,7 @@ from pyramid.events import ( from pyramid.exceptions import PredicateMismatch from pyramid.httpexceptions import HTTPNotFound from pyramid.request import Request +from pyramid.view import find_views from pyramid.threadlocal import manager from pyramid.traversal import ( @@ -138,9 +139,14 @@ class Router(object): # find a view callable context_iface = providedBy(context) - view_callable = adapters.lookup( - (IViewClassifier, request.request_iface, context_iface), - IView, name=view_name, default=None) + views_iter = find_views( + registry, + request.request_iface, + context_iface, + view_name, + ) + + view_callable = next(views_iter, None) # invoke the view callable if view_callable is None: @@ -164,14 +170,7 @@ class Router(object): except PredicateMismatch: # look for other views that meet the predicate # criteria - for iface in context_iface.__sro__[1:]: - previous_view_callable = view_callable - view_callable = adapters.lookup( - (IViewClassifier, request.request_iface, iface), - IView, name=view_name, default=None) - # intermediate bases may lookup same view_callable - if view_callable is previous_view_callable: - continue + for view_callable in views_iter: if view_callable is not None: try: response = view_callable(context, request) @@ -241,4 +240,3 @@ class Router(object): request = self.request_factory(environ) response = self.invoke_subrequest(request, use_tweens=True) return response(request.environ, start_response) - diff --git a/pyramid/view.py b/pyramid/view.py index 02ac8849f..9ee9503f7 100644 --- a/pyramid/view.py +++ b/pyramid/view.py @@ -4,6 +4,8 @@ from zope.interface import providedBy from pyramid.interfaces import ( IRoutesMapper, + IMultiView, + ISecuredView, IView, IViewClassifier, ) @@ -414,3 +416,13 @@ class forbidden_view_config(object): settings['_info'] = info.codeinfo # fbo "action_method" return wrapped +def find_views(registry, request_iface, context_iface, view_name): + adapters = registry.adapters + for req_type in request_iface.__sro__: + for iface in context_iface.__sro__: + for view_type in (IView, ISecuredView, IMultiView): + view_callable = adapters.registered( + (IViewClassifier, req_type, iface), + view_type, name=view_name) + if view_callable is not None: + yield view_callable |
