From b5f5b3d343ceeb7f211bf300be6377a9325a51e8 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 31 May 2009 14:14:34 +0000 Subject: - The error presented when a view invoked by the router returns a non-response object now includes the view's name for troubleshooting purposes. - A "new response" event is emitted for forbiden and notfound views. --- repoze/bfg/router.py | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) (limited to 'repoze/bfg/router.py') diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 32b8c5b72..b243ec5b0 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -16,7 +16,6 @@ from repoze.bfg.events import WSGIApplicationCreatedEvent from repoze.bfg.interfaces import ILogger from repoze.bfg.interfaces import ISecurityPolicy -from repoze.bfg.interfaces import INotFoundAppFactory from repoze.bfg.interfaces import IRequestFactory from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.interfaces import IRootFactory @@ -24,7 +23,9 @@ from repoze.bfg.interfaces import IRouter from repoze.bfg.interfaces import IRoutesMapper from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import IForbiddenView +from repoze.bfg.interfaces import INotFoundView from repoze.bfg.interfaces import IUnauthorizedAppFactory +from repoze.bfg.interfaces import INotFoundAppFactory from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IAuthorizationPolicy @@ -112,6 +113,9 @@ class Router(object): app = notfound_app_factory() response = request.get_response(app) return response + + notfound = registry.queryUtility(INotFoundView, + default=notfound) self.notfound_view = notfound or default_notfound_view @@ -134,11 +138,20 @@ class Router(object): iterable. """ registry = self.registry + logger = self.logger + threadlocals = {'registry':registry, 'request':None} self.threadlocal_manager.push(threadlocals) - logger = self.logger - request = None + def respond(response, view_name): + registry.has_listeners and registry.notify(NewResponse(response)) + try: + start_response(response.status, response.headerlist) + return response.app_iter + except AttributeError: + raise ValueError( + 'Non-response object returned from view %s: %r' % + (view_name, response)) try: if self.request_factory is None: @@ -221,9 +234,8 @@ class Router(object): environ['repoze.bfg.message'] = msg - response = self.forbidden_view(context, request) - start_response(response.status, response.headerlist) - return response.app_iter + return respond(self.forbidden_view(context, request), + '') response = registry.queryMultiAdapter( (context, request), IView, name=view_name) @@ -241,18 +253,10 @@ class Router(object): else: msg = request.url environ['repoze.bfg.message'] = msg - response = self.notfound_view(context, request) - start_response(response.status, response.headerlist) - return response.app_iter - - registry.has_listeners and registry.notify(NewResponse(response)) + return respond(self.notfound_view(context, request), + '') - try: - start_response(response.status, response.headerlist) - return response.app_iter - except AttributeError: - raise ValueError( - 'Non-response object returned from view: %r' % response) + return respond(response, view_name) finally: self.threadlocal_manager.pop() -- cgit v1.2.3