summaryrefslogtreecommitdiff
path: root/repoze/bfg/router.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-19 01:17:21 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-19 01:17:21 +0000
commit4df5751de28947538da491dc8ebe0dfb27f742d5 (patch)
tree491c7029cb50f4baed54ddf7485b4aa0bb02d739 /repoze/bfg/router.py
parent7bce0d6d925370dd5721100c28693f806b68344b (diff)
downloadpyramid-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.py39
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