summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-07-04 03:12:19 -0400
committerChris McDonough <chrism@plope.com>2011-07-04 03:12:19 -0400
commit661ea7644a8c725a0f03df01c1618a592e712e1a (patch)
treeb06dd8120d8943f3226f58a6f45c67831ee13dc9
parent0fa1993d2abe87e197374f6abd3e45e62afb8a19 (diff)
downloadpyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.tar.gz
pyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.tar.bz2
pyramid-661ea7644a8c725a0f03df01c1618a592e712e1a.zip
partial conversion to eager response resolving
-rw-r--r--pyramid/config.py58
-rw-r--r--pyramid/router.py11
-rw-r--r--pyramid/tests/test_config.py18
-rw-r--r--pyramid/tests/test_integration.py2
-rw-r--r--pyramid/tests/test_view.py13
-rw-r--r--pyramid/view.py6
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):