diff options
| author | Chris McDonough <chrism@plope.com> | 2011-07-04 03:12:19 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-07-04 03:12:19 -0400 |
| commit | 661ea7644a8c725a0f03df01c1618a592e712e1a (patch) | |
| tree | b06dd8120d8943f3226f58a6f45c67831ee13dc9 | |
| parent | 0fa1993d2abe87e197374f6abd3e45e62afb8a19 (diff) | |
| download | pyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.tar.gz pyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.tar.bz2 pyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.zip | |
partial conversion to eager response resolving
| -rw-r--r-- | pyramid/config.py | 58 | ||||
| -rw-r--r-- | pyramid/router.py | 11 | ||||
| -rw-r--r-- | pyramid/tests/test_config.py | 18 | ||||
| -rw-r--r-- | pyramid/tests/test_integration.py | 2 | ||||
| -rw-r--r-- | pyramid/tests/test_view.py | 13 | ||||
| -rw-r--r-- | pyramid/view.py | 6 |
6 files changed, 48 insertions, 60 deletions
diff --git a/pyramid/config.py b/pyramid/config.py index be0e425c8..493a37f3b 100644 --- a/pyramid/config.py +++ b/pyramid/config.py @@ -2931,8 +2931,23 @@ class ViewDeriver(object): self.owrapped_view( self.decorated_view( self.http_cached_view( - self.rendered_view( - self.mapped_view(view))))))))) + self.response_resolved_view( + self.rendered_view( + self.mapped_view(view)))))))))) + + @wraps_view + def response_resolved_view(self, view): + registry = self.registry + def wrapper(context, request): + result = view(context, request) + response = registry.queryAdapterOrSelf(result, IResponse) + if response is None: + if response is None: + raise ValueError( + 'Could not convert view return value "%s" into a ' + 'response object' % (result,)) + return response + return wrapper @wraps_view def mapped_view(self, view): @@ -2970,11 +2985,12 @@ class ViewDeriver(object): @wraps_view def http_cached_view(self, view): seconds = self.kw.get('http_cache') - options = {} if seconds is None: return view + options = {} + if isinstance(seconds, (tuple, list)): try: seconds, options = seconds @@ -2985,9 +3001,7 @@ class ViewDeriver(object): def wrapper(context, request): response = view(context, request) - cache_expires = getattr(response, 'cache_expires', None) - if cache_expires is not None: - cache_expires(seconds, **options) + response.cache_expires(seconds, **options) return response return wrapper @@ -3108,24 +3122,22 @@ class ViewDeriver(object): def _rendered_view(context, request): renderer = static_renderer - result = wrapped_view(context, request) + response = wrapped_view(context, request) registry = self.kw['registry'] - response = registry.queryAdapterOrSelf(result, IResponse) - if response is None: - attrs = getattr(request, '__dict__', {}) - if 'override_renderer' in attrs: - # renderer overridden by newrequest event or other - renderer_name = attrs.pop('override_renderer') - renderer = RendererHelper(name=renderer_name, - package=self.kw.get('package'), - registry = registry) - if '__view__' in attrs: - view_inst = attrs.pop('__view__') - else: - view_inst = getattr(wrapped_view, '__original_view__', - wrapped_view) - response = renderer.render_view(request, result, view_inst, - context) + attrs = getattr(request, '__dict__', {}) + if 'override_renderer' in attrs: + # renderer overridden by newrequest event or other + renderer_name = attrs.pop('override_renderer') + renderer = RendererHelper(name=renderer_name, + package=self.kw.get('package'), + registry = registry) + if '__view__' in attrs: + view_inst = attrs.pop('__view__') + else: + view_inst = getattr(wrapped_view, '__original_view__', + wrapped_view) + response = renderer.render_view(request, response, view_inst, + context) return response return _rendered_view diff --git a/pyramid/router.py b/pyramid/router.py index 458237a8c..d011b1245 100644 --- a/pyramid/router.py +++ b/pyramid/router.py @@ -159,7 +159,7 @@ class Router(object): msg = request.path_info raise HTTPNotFound(msg) else: - result = view_callable(context, request) + response = view_callable(context, request) # handle exceptions raised during root finding and view-exec except Exception, why: @@ -173,14 +173,7 @@ class Router(object): if view_callable is None: raise - result = view_callable(why, request) - - # process the response - response = registry.queryAdapterOrSelf(result, IResponse) - if response is None: - raise ValueError( - 'Could not convert view return value "%s" into a ' - 'response object' % (result,)) + response = view_callable(why, request) has_listeners and notify(NewResponse(request, response)) diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py index fa1ad2b88..0b178d22e 100644 --- a/pyramid/tests/test_config.py +++ b/pyramid/tests/test_config.py @@ -3972,7 +3972,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(predicates, [True, True]) def test_with_wrapper_viewname(self): - from webob import Response + from pyramid.response import Response from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier inner_response = Response('OK') @@ -3996,7 +3996,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(response.body, 'outer OK') def test_with_wrapper_viewname_notfound(self): - from webob import Response + from pyramid.response import Response inner_response = Response('OK') def inner_view(context, request): return inner_response @@ -4198,7 +4198,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_integer(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4218,7 +4218,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_timedelta(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4238,7 +4238,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_tuple(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4257,7 +4257,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(headers['Cache-Control'], 'max-age=3600, public') def test_http_cached_view_tuple_seconds_None(self): - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4274,8 +4274,10 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(headers['Cache-Control'], 'public') def test_http_cached_view_nonresponse_object_returned_downstream(self): + from pyramid.response import Response + response = Response() def inner_view(context, request): - return None + return response deriver = self._makeOne(http_cache=3600) result = deriver(inner_view) self.assertFalse(result is inner_view) @@ -4283,7 +4285,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(inner_view.__doc__, result.__doc__) request = self._makeRequest() result = result(None, request) - self.assertEqual(result, None) # doesn't blow up + self.assertEqual(result, response) # doesn't blow up def test_http_cached_view_bad_tuple(self): from pyramid.exceptions import ConfigurationError diff --git a/pyramid/tests/test_integration.py b/pyramid/tests/test_integration.py index dd77d3aec..0ef1e1631 100644 --- a/pyramid/tests/test_integration.py +++ b/pyramid/tests/test_integration.py @@ -39,7 +39,7 @@ class WGSIAppPlusViewConfigTests(unittest.TestCase): reg = config.registry view = reg.adapters.lookup( (IViewClassifier, IRequest, INothing), IView, name='') - self.assertEqual(view, wsgiapptest) + self.assertEqual(view.__original_view__, wsgiapptest) here = os.path.dirname(__file__) staticapp = static(os.path.join(here, 'fixtures')) diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py index ce00454fc..6bb3b01a0 100644 --- a/pyramid/tests/test_view.py +++ b/pyramid/tests/test_view.py @@ -121,19 +121,6 @@ class RenderViewToIterableTests(BaseTest, unittest.TestCase): secure=True) self.assertEqual(iterable, ()) - def test_call_view_returns_iresponse_adaptable(self): - from pyramid.response import Response - request = self._makeRequest() - context = self._makeContext() - view = make_view('123') - self._registerView(request.registry, view, 'registered') - def str_response(s): - return Response(s) - request.registry.registerAdapter(str_response, (str,), IResponse) - iterable = self._callFUT(context, request, name='registered', - secure=True) - self.assertEqual(iterable, ['123']) - def test_call_view_registered_insecure_no_call_permissive(self): context = self._makeContext() request = self._makeRequest() diff --git a/pyramid/view.py b/pyramid/view.py index ea20a19c2..ef7352301 100644 --- a/pyramid/view.py +++ b/pyramid/view.py @@ -4,7 +4,6 @@ import venusian from zope.interface import providedBy from zope.deprecation import deprecated -from pyramid.interfaces import IResponse from pyramid.interfaces import IRoutesMapper from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier @@ -101,11 +100,6 @@ def render_view_to_iterable(context, request, name='', secure=True): response = render_view_to_response(context, request, name, secure) if response is None: return None - try: - reg = request.registry - except AttributeError: - reg = get_current_registry() - response = reg.queryAdapterOrSelf(response, IResponse) return response.app_iter def render_view(context, request, name='', secure=True): |
