diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-05-31 14:14:34 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-05-31 14:14:34 +0000 |
| commit | b5f5b3d343ceeb7f211bf300be6377a9325a51e8 (patch) | |
| tree | 10fa3edcbd7de29d55383c35af1f9e340b64ee00 /repoze/bfg/router.py | |
| parent | 558231697e011eff686fbc764c64789a34083059 (diff) | |
| download | pyramid-b5f5b3d343ceeb7f211bf300be6377a9325a51e8.tar.gz pyramid-b5f5b3d343ceeb7f211bf300be6377a9325a51e8.tar.bz2 pyramid-b5f5b3d343ceeb7f211bf300be6377a9325a51e8.zip | |
- 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.
Diffstat (limited to 'repoze/bfg/router.py')
| -rw-r--r-- | repoze/bfg/router.py | 38 |
1 files changed, 21 insertions, 17 deletions
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), + '<IForbiddenView>') 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), + '<INotFoundView>') - 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() |
