summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-04-14 02:49:19 +0000
committerChris McDonough <chrism@agendaless.com>2010-04-14 02:49:19 +0000
commitff1213e8f2aed987108ba57aed517c033491b1aa (patch)
treef531544c3373ae7d5b51746987cb373326277a9c /repoze/bfg/router.py
parent2b6bc8adfa294f7133680f64df411251afb67dfc (diff)
downloadpyramid-ff1213e8f2aed987108ba57aed517c033491b1aa.tar.gz
pyramid-ff1213e8f2aed987108ba57aed517c033491b1aa.tar.bz2
pyramid-ff1213e8f2aed987108ba57aed517c033491b1aa.zip
Add "exception views" work contributed primarily by Andrey Popp by merging the "phash" branch.
Diffstat (limited to 'repoze/bfg/router.py')
-rw-r--r--repoze/bfg/router.py41
1 files changed, 19 insertions, 22 deletions
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index 13da06266..d63eceb32 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -2,8 +2,7 @@ from zope.interface import implements
from zope.interface import providedBy
from repoze.bfg.interfaces import IDebugLogger
-from repoze.bfg.interfaces import IForbiddenView
-from repoze.bfg.interfaces import INotFoundView
+from repoze.bfg.interfaces import IExceptionViewClassifier
from repoze.bfg.interfaces import IRequest
from repoze.bfg.interfaces import IRootFactory
from repoze.bfg.interfaces import IRouteRequest
@@ -12,19 +11,17 @@ from repoze.bfg.interfaces import IRoutesMapper
from repoze.bfg.interfaces import ISettings
from repoze.bfg.interfaces import ITraverser
from repoze.bfg.interfaces import IView
+from repoze.bfg.interfaces import IViewClassifier
from repoze.bfg.configuration import make_app # b/c import
from repoze.bfg.events import AfterTraversal
from repoze.bfg.events import NewRequest
from repoze.bfg.events import NewResponse
-from repoze.bfg.exceptions import Forbidden
from repoze.bfg.exceptions import NotFound
from repoze.bfg.request import Request
from repoze.bfg.threadlocal import manager
from repoze.bfg.traversal import DefaultRootFactory
from repoze.bfg.traversal import ModelGraphTraverser
-from repoze.bfg.view import default_forbidden_view
-from repoze.bfg.view import default_notfound_view
make_app # prevent pyflakes from complaining
@@ -37,8 +34,6 @@ class Router(object):
def __init__(self, registry):
q = registry.queryUtility
self.logger = q(IDebugLogger)
- self.notfound_view = q(INotFoundView, default=default_notfound_view)
- self.forbidden_view = q(IForbiddenView, default=default_forbidden_view)
self.root_factory = q(IRootFactory, default=DefaultRootFactory)
self.routes_mapper = q(IRoutesMapper)
self.root_policy = self.root_factory # b/w compat
@@ -56,6 +51,7 @@ class Router(object):
return an iterable.
"""
registry = self.registry
+ adapters = registry.adapters
has_listeners = registry.has_listeners
logger = self.logger
manager = self.threadlocal_manager
@@ -72,7 +68,7 @@ class Router(object):
has_listeners and registry.notify(NewRequest(request))
request_iface = IRequest
-
+
try:
# find the root
root_factory = self.root_factory
@@ -94,7 +90,6 @@ class Router(object):
attrs['root'] = root
# find a view callable
- adapters = registry.adapters
traverser = adapters.queryAdapter(root, ITraverser)
if traverser is None:
traverser = ModelGraphTraverser(root)
@@ -107,7 +102,7 @@ class Router(object):
has_listeners and registry.notify(AfterTraversal(request))
context_iface = providedBy(context)
view_callable = adapters.lookup(
- (request_iface, context_iface),
+ (IViewClassifier, request_iface, context_iface),
IView, name=view_name, default=None)
# invoke the view callable
@@ -125,25 +120,27 @@ class Router(object):
else:
msg = request.path_info
environ['repoze.bfg.message'] = msg
- response = self.notfound_view(context, request)
+ raise NotFound(msg)
else:
response = view_callable(context, request)
# handle exceptions raised during root finding and view lookup
- except Forbidden, why:
- try:
- msg = why[0]
- except (IndexError, TypeError):
- msg = ''
- environ['repoze.bfg.message'] = msg
- response = self.forbidden_view(context, request)
- except NotFound, why:
+ except Exception, why:
+ for_ = (IExceptionViewClassifier,
+ request_iface.combined,
+ providedBy(why))
+ view_callable = adapters.lookup(for_, IView, default=None)
+ if view_callable is None:
+ raise
+
try:
msg = why[0]
- except (IndexError, TypeError):
+ except Exception:
msg = ''
environ['repoze.bfg.message'] = msg
- response = self.notfound_view(context, request)
+
+ attrs['exception'] = why
+ response = view_callable(why, request)
# process the response
has_listeners and registry.notify(NewResponse(response))
@@ -159,7 +156,7 @@ class Router(object):
if 'global_response_headers' in attrs:
headers = list(headers)
headers.extend(attrs['global_response_headers'])
-
+
start_response(status, headers)
return app_iter