summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2015-02-05 16:39:16 -0600
committerMichael Merickel <michael@merickel.org>2015-02-05 16:39:16 -0600
commit85d801817e2137848a3ccb4303b88ace063a81d5 (patch)
tree26534d74a26e833a5672add4ec340319041025ea
parent686f03bab3df9e1527dce1b02bcca1b05fc74bf5 (diff)
downloadpyramid-85d801817e2137848a3ccb4303b88ace063a81d5.tar.gz
pyramid-85d801817e2137848a3ccb4303b88ace063a81d5.tar.bz2
pyramid-85d801817e2137848a3ccb4303b88ace063a81d5.zip
provide a fix for view lookup fallbacks
-rw-r--r--pyramid/router.py22
-rw-r--r--pyramid/view.py12
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