summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-09-16 01:48:30 -0400
committerChris McDonough <chrism@plope.com>2012-09-16 01:48:30 -0400
commitdd9859fb7e93875f246059f2bc6b18cb10dbeff9 (patch)
treed13068da73b04d96750b6f1d9d18c0647e1f4d8e
parentfa4672fcb490dd0767fed10c557734b43cd845b8 (diff)
downloadpyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.tar.gz
pyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.tar.bz2
pyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.zip
sketch out a subrequest API
-rw-r--r--pyramid/router.py36
1 files changed, 25 insertions, 11 deletions
diff --git a/pyramid/router.py b/pyramid/router.py
index 0cbe00f3a..ffc67eae5 100644
--- a/pyramid/router.py
+++ b/pyramid/router.py
@@ -53,6 +53,7 @@ class Router(object):
tweens = q(ITweens)
if tweens is None:
tweens = excview_tween_factory
+ self.orig_handle_request = self.handle_request
self.handle_request = tweens(self.handle_request, registry)
self.root_policy = self.root_factory # b/w compat
self.registry = registry
@@ -161,35 +162,35 @@ class Router(object):
return response
- def __call__(self, environ, start_response):
- """
- Accept ``environ`` and ``start_response``; create a
- :term:`request` and route the request to a :app:`Pyramid`
- view based on introspection of :term:`view configuration`
- within the application registry; call ``start_response`` and
- return an iterable.
- """
+ def subrequest(self, request, use_tweens=False):
registry = self.registry
has_listeners = self.registry.has_listeners
notify = self.registry.notify
- request = self.request_factory(environ)
threadlocals = {'registry':registry, 'request':request}
manager = self.threadlocal_manager
manager.push(threadlocals)
request.registry = registry
+ request.subrequest = self.subrequest
+ if use_tweens:
+ handle_request = self.handle_request
+ else:
+ handle_request = self.orig_handle_request
try:
try:
extensions = self.request_extensions
if extensions is not None:
request._set_extensions(extensions)
- response = self.handle_request(request)
+ response = handle_request(request)
has_listeners and notify(NewResponse(request, response))
if request.response_callbacks:
request._process_response_callbacks(response)
- return response(request.environ, start_response)
+ # XXX before subrequest factoring, the below line
+ # actually invoked Response.__call__, passing it
+ # the start_response
+ return response
finally:
if request.finished_callbacks:
@@ -197,3 +198,16 @@ class Router(object):
finally:
manager.pop()
+
+ def __call__(self, environ, start_response):
+ """
+ Accept ``environ`` and ``start_response``; create a
+ :term:`request` and route the request to a :app:`Pyramid`
+ view based on introspection of :term:`view configuration`
+ within the application registry; call ``start_response`` and
+ return an iterable.
+ """
+ request = self.request_factory(environ)
+ response = self.subrequest(request, use_tweens=True)
+ return response(request.environ, start_response)
+