From 4936f862588240c51e619a65aa5d574ba29d784b Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 31 May 2009 03:13:13 +0000 Subject: 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. --- repoze/bfg/router.py | 50 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 13 deletions(-) (limited to 'repoze/bfg/router.py') 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): -- cgit v1.2.3