summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-31 14:14:34 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-31 14:14:34 +0000
commitb5f5b3d343ceeb7f211bf300be6377a9325a51e8 (patch)
tree10fa3edcbd7de29d55383c35af1f9e340b64ee00 /repoze/bfg/router.py
parent558231697e011eff686fbc764c64789a34083059 (diff)
downloadpyramid-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.py38
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()