diff options
| author | Chris McDonough <chrism@plope.com> | 2012-09-16 01:48:30 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2012-09-16 01:48:30 -0400 |
| commit | dd9859fb7e93875f246059f2bc6b18cb10dbeff9 (patch) | |
| tree | d13068da73b04d96750b6f1d9d18c0647e1f4d8e | |
| parent | fa4672fcb490dd0767fed10c557734b43cd845b8 (diff) | |
| download | pyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.tar.gz pyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.tar.bz2 pyramid-dd9859fb7e93875f246059f2bc6b18cb10dbeff9.zip | |
sketch out a subrequest API
| -rw-r--r-- | pyramid/router.py | 36 |
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) + |
