summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-31 03:13:13 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-31 03:13:13 +0000
commit4936f862588240c51e619a65aa5d574ba29d784b (patch)
treef73f81fa6f2603773948598218d32d74c6475ee2 /repoze/bfg/router.py
parent964b7852d997f6c4aa4b04d54f2847095e4461e8 (diff)
downloadpyramid-4936f862588240c51e619a65aa5d574ba29d784b.tar.gz
pyramid-4936f862588240c51e619a65aa5d574ba29d784b.tar.bz2
pyramid-4936f862588240c51e619a65aa5d574ba29d784b.zip
Features
-------- - It is now possible to register a custom ``repoze.bfg.interfaces.INotFoundView`` for a given application. This feature replaces the ``repoze.bfg.interfaces.INotFoundAppFactory`` feature previously described in the Hooks chapter. The INotFoundView will be called when the framework detects that a view lookup done as a result of a reqest fails; it should accept a context object and a request object; it should return an IResponse object (a webob response, basically). See the Hooks narrative chapter of the BFG docs for more info. Deprecations ------------ - The ``repoze.bfg.interfaces.IUnauthorizedAppFactory`` interface has been deprecated in favor of using the new ``repoze.bfg.interfaces.IForbiddenResponseFactory`` mechanism.
Diffstat (limited to 'repoze/bfg/router.py')
-rw-r--r--repoze/bfg/router.py50
1 files changed, 37 insertions, 13 deletions
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py
index 6e6477be1..32b8c5b72 100644
--- a/repoze/bfg/router.py
+++ b/repoze/bfg/router.py
@@ -50,8 +50,6 @@ from repoze.bfg.traversal import _traverse
from repoze.bfg.urldispatch import RoutesRootFactory
-from repoze.bfg.wsgi import NotFound
-
_marker = object()
class Router(object):
@@ -68,17 +66,17 @@ class Router(object):
self.request_factory = registry.queryUtility(IRequestFactory)
+ forbidden = None
+
unauthorized_app_factory = registry.queryUtility(
IUnauthorizedAppFactory)
- forbidden = None
-
if unauthorized_app_factory is not None:
warning = (
'Instead of registering a utility against the '
'repoze.bfg.interfaces.IUnauthorizedAppFactory interface '
'to return a custom forbidden response, you should now '
- 'register a "repoze.interfaces.IForbiddenView". '
+ 'register a repoze.interfaces.IForbiddenView.'
'The IUnauthorizedAppFactory interface was deprecated in '
'repoze.bfg 0.9 and will be removed in a subsequent version '
'of repoze.bfg. See the "Hooks" chapter of the repoze.bfg '
@@ -92,10 +90,30 @@ class Router(object):
forbidden = registry.queryUtility(IForbiddenView, default=forbidden)
- self.forbidden_resp_factory = forbidden or default_forbidden_view
+ self.forbidden_view = forbidden or default_forbidden_view
+
+ notfound = None
- self.notfound_app_factory = registry.queryUtility(INotFoundAppFactory,
- default=NotFound)
+ notfound_app_factory = registry.queryUtility(INotFoundAppFactory)
+
+ if notfound_app_factory is not None:
+ warning = (
+ 'Instead of registering a utility against the '
+ 'repoze.bfg.interfaces.INotFoundAppFactory interface '
+ 'to return a custom notfound response, you should register '
+ 'a repoze.bfg.interfaces.INotFoundView. The '
+ 'INotFoundAppFactory interface was deprecated in'
+ 'repoze.bfg 0.9 and will be removed in a subsequent version '
+ 'of repoze.bfg. See the "Hooks" chapter of the repoze.bfg '
+ 'documentation for more information about '
+ 'INotFoundView.')
+ self.logger and self.logger.warn(warning)
+ def notfound(context, request):
+ app = notfound_app_factory()
+ response = request.get_response(app)
+ return response
+
+ self.notfound_view = notfound or default_notfound_view
settings = registry.queryUtility(ISettings)
if settings is not None:
@@ -203,7 +221,7 @@ class Router(object):
environ['repoze.bfg.message'] = msg
- response = self.forbidden_resp_factory(context, request)
+ response = self.forbidden_view(context, request)
start_response(response.status, response.headerlist)
return response.app_iter
@@ -223,8 +241,9 @@ class Router(object):
else:
msg = request.url
environ['repoze.bfg.message'] = msg
- notfound_app = self.notfound_app_factory()
- return notfound_app(environ, start_response)
+ response = self.notfound_view(context, request)
+ start_response(response.status, response.headerlist)
+ return response.app_iter
registry.has_listeners and registry.notify(NewResponse(response))
@@ -238,8 +257,7 @@ class Router(object):
finally:
self.threadlocal_manager.pop()
-def default_forbidden_view(context, request):
- status = '401 Unauthorized'
+def default_view(context, request, status):
try:
msg = escape(request.environ['repoze.bfg.message'])
except KeyError:
@@ -260,6 +278,12 @@ def default_forbidden_view(context, request):
headerlist = headers,
app_iter = [html])
+def default_forbidden_view(context, request):
+ return default_view(context, request, '401 Unauthorized')
+
+def default_notfound_view(context, request):
+ return default_view(context, request, '404 Not Found')
+
def make_app(root_factory, package=None, filename='configure.zcml',
authentication_policy=None, authorization_policy=None,
options=None, registry=None, debug_logger=None):