change excview_tween to use _call_view instead of adapters.lookup; parameterize _call_view and _find_views to cope
| | |
| | | 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__ |
| | |
| | | # 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 |
| | | |
| | |
| | | ISecuredView, |
| | | IView, |
| | | IViewClassifier, |
| | | IRequest, |
| | | ) |
| | | |
| | | from pyramid.compat import decode_path_info |
| | |
| | | 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, |
| | |
| | | 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 |