diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-19 01:17:21 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-19 01:17:21 +0000 |
| commit | 4df5751de28947538da491dc8ebe0dfb27f742d5 (patch) | |
| tree | 491c7029cb50f4baed54ddf7485b4aa0bb02d739 /repoze/bfg/router.py | |
| parent | 7bce0d6d925370dd5721100c28693f806b68344b (diff) | |
| download | pyramid-4df5751de28947538da491dc8ebe0dfb27f742d5.tar.gz pyramid-4df5751de28947538da491dc8ebe0dfb27f742d5.tar.bz2 pyramid-4df5751de28947538da491dc8ebe0dfb27f742d5.zip | |
- The concept of "view factories" was removed in favor of always
calling a view, which is a callable that returns a response
directly (as opposed to returning a view). As a result, the
``factory`` attribute in the bfg:view ZCML statement has been
renamed to ``view``. Various interface names were changed also.
- ``render_template`` and ``render_transform`` no longer return a
Response object. Instead, these return strings. The old behavior
can be obtained by using ``render_template_to_response`` and
``render_transform_to_response``.
Diffstat (limited to 'repoze/bfg/router.py')
| -rw-r--r-- | repoze/bfg/router.py | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 791d6772e..231a3560b 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -7,15 +7,16 @@ from webob import Request from webob.exc import HTTPNotFound from webob.exc import HTTPUnauthorized -from repoze.bfg.interfaces import IPublishTraverserFactory -from repoze.bfg.interfaces import IViewFactory +from repoze.bfg.interfaces import ITraverserFactory +from repoze.bfg.interfaces import IView from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import ISecurityPolicy -from repoze.bfg.interfaces import IWSGIApplicationFactory from repoze.bfg.interfaces import IRequest from repoze.bfg.registry import registry_manager +_marker = () + class Router: """ WSGI application which routes requests to 'view' code based on a view registry""" @@ -29,10 +30,12 @@ class Router: directlyProvides(request, IRequest) root = self.root_policy(environ) path = environ.get('PATH_INFO', '/') - traverser = getMultiAdapter((root, request), IPublishTraverserFactory) + traverser = getMultiAdapter((root, request), ITraverserFactory) context, name, subpath = traverser(path) - request.subpath = subpath + + request.context = context request.view_name = name + request.subpath = subpath security_policy = queryUtility(ISecurityPolicy) if security_policy: @@ -44,13 +47,27 @@ class Router: app.explanation = repr(permission) return app(environ, start_response) - app = queryMultiAdapter((context, request), IViewFactory, name=name) - if app is None: + response = queryMultiAdapter((context, request), IView, name=name, + default=_marker) + if response is _marker: app = HTTPNotFound(request.url) - else: - app = getMultiAdapter((context, request, app), - IWSGIApplicationFactory) - return app(environ, start_response) + return app(environ, start_response) + + if not isResponse(response): + raise ValueError('response was not IResponse: %s' % response) + + start_response(response.status, response.headerlist) + return response.app_iter + +def isResponse(ob): + # response objects aren't obligated to implement a Zope interface, + # so we do it the hard way + if ( hasattr(ob, 'app_iter') and hasattr(ob, 'headerlist') and + hasattr(ob, 'status') ): + if ( hasattr(ob.app_iter, '__iter__') and + hasattr(ob.headerlist, '__iter__') and + isinstance(ob.status, basestring) ) : + return True def make_app(root_policy, package=None, filename='configure.zcml'): """ Create a view registry based on the application's ZCML. and |
