diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-05-31 03:13:13 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-05-31 03:13:13 +0000 |
| commit | 4936f862588240c51e619a65aa5d574ba29d784b (patch) | |
| tree | f73f81fa6f2603773948598218d32d74c6475ee2 /repoze/bfg/router.py | |
| parent | 964b7852d997f6c4aa4b04d54f2847095e4461e8 (diff) | |
| download | pyramid-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.py | 50 |
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): |
