Advertisement
Guest User

Untitled

a guest
Apr 2nd, 2015
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.49 KB | None | 0 0
  1. diff --git a/pyramid/router.py b/pyramid/router.py
  2. index ba4f85b..a11e556 100644
  3. --- a/pyramid/router.py
  4. +++ b/pyramid/router.py
  5. @@ -1,10 +1,12 @@
  6. from zope.interface import (
  7. implementer,
  8. providedBy,
  9. + Interface,
  10. )
  11.  
  12. from pyramid.interfaces import (
  13. IDebugLogger,
  14. + IMultiView,
  15. IRequest,
  16. IRequestExtensions,
  17. IRootFactory,
  18. @@ -12,6 +14,7 @@ from pyramid.interfaces import (
  19. IRouter,
  20. IRequestFactory,
  21. IRoutesMapper,
  22. + ISecuredView,
  23. ITraverser,
  24. IView,
  25. IViewClassifier,
  26. @@ -138,9 +141,10 @@ class Router(object):
  27.  
  28. # find a view callable
  29. context_iface = providedBy(context)
  30. - view_callable = adapters.lookup(
  31. - (IViewClassifier, request.request_iface, context_iface),
  32. - IView, name=view_name, default=None)
  33. + views_iter = get_views(
  34. + adapters, request.request_iface, context_iface, view_name)
  35. +
  36. + view_callable = next(views_iter, None)
  37.  
  38. # invoke the view callable
  39. if view_callable is None:
  40. @@ -164,14 +168,7 @@ class Router(object):
  41. except PredicateMismatch:
  42. # look for other views that meet the predicate
  43. # criteria
  44. - for iface in context_iface.__sro__[1:]:
  45. - previous_view_callable = view_callable
  46. - view_callable = adapters.lookup(
  47. - (IViewClassifier, request.request_iface, iface),
  48. - IView, name=view_name, default=None)
  49. - # intermediate bases may lookup same view_callable
  50. - if view_callable is previous_view_callable:
  51. - continue
  52. + for view_callable in views_iter:
  53. if view_callable is not None:
  54. try:
  55. response = view_callable(context, request)
  56. @@ -242,3 +239,12 @@ class Router(object):
  57. response = self.invoke_subrequest(request, use_tweens=True)
  58. return response(request.environ, start_response)
  59.  
  60. +def get_views(adapters, request_iface, context_iface, view_name):
  61. + for iface in context_iface.__sro__:
  62. + for view_type in (IView, ISecuredView, IMultiView):
  63. + for req_type in request_iface.__sro__:
  64. + view_callable = adapters.registered(
  65. + (IViewClassifier, req_type, iface),
  66. + view_type, name=view_name)
  67. + if view_callable is not None:
  68. + yield view_callable
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement