Loading django/views/decorators/cache.py +6 −43 Original line number Diff line number Diff line Loading @@ -18,54 +18,17 @@ def cache_page(*args, **kwargs): Additionally, all headers from the response's Vary header will be taken into account on caching -- just like the middleware does. """ # We need backwards compatibility with code which spells it this way: # def my_view(): pass # my_view = cache_page(my_view, 123) # and this way: # my_view = cache_page(123)(my_view) # and this: # my_view = cache_page(my_view, 123, key_prefix="foo") # and this: # my_view = cache_page(123, key_prefix="foo")(my_view) # and possibly this way (?): # my_view = cache_page(123, my_view) # and also this way: # my_view = cache_page(my_view) # and also this way: # my_view = cache_page()(my_view) # We also add some asserts to give better error messages in case people are # using other ways to call cache_page that no longer work. if len(args) != 1 or callable(args[0]): raise TypeError("cache_page has a single mandatory positional argument: timeout") cache_timeout = args[0] cache_alias = kwargs.pop('cache', None) key_prefix = kwargs.pop('key_prefix', None) assert not kwargs, "The only keyword arguments are cache and key_prefix" def warn(): import warnings warnings.warn('The cache_page decorator must be called like: ' 'cache_page(timeout, [cache=cache name], [key_prefix=key prefix]). ' 'All other ways are deprecated.', DeprecationWarning, stacklevel=2) if kwargs: raise TypeError("cache_page has two optional keyword arguments: cache and key_prefix") if len(args) > 1: assert len(args) == 2, "cache_page accepts at most 2 arguments" warn() if callable(args[0]): return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[1], cache_alias=cache_alias, key_prefix=key_prefix)(args[0]) elif callable(args[1]): return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], cache_alias=cache_alias, key_prefix=key_prefix)(args[1]) else: assert False, "cache_page must be passed a view function if called with two arguments" elif len(args) == 1: if callable(args[0]): warn() return decorator_from_middleware_with_args(CacheMiddleware)(cache_alias=cache_alias, key_prefix=key_prefix)(args[0]) else: # The One True Way return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], cache_alias=cache_alias, key_prefix=key_prefix) else: warn() return decorator_from_middleware_with_args(CacheMiddleware)(cache_alias=cache_alias, key_prefix=key_prefix) return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=cache_timeout, cache_alias=cache_alias, key_prefix=key_prefix) def cache_control(**kwargs): Loading tests/regressiontests/cache/tests.py +7 −31 Original line number Diff line number Diff line Loading @@ -1478,19 +1478,12 @@ def hello_world_view(request, value): ) class CacheMiddlewareTest(TestCase): # The following tests will need to be modified in Django 1.6 to not use # deprecated ways of using the cache_page decorator that will be removed in # such version def setUp(self): self.factory = RequestFactory() self.default_cache = get_cache('default') self.other_cache = get_cache('other') self.save_warnings_state() warnings.filterwarnings('ignore', category=DeprecationWarning, module='django.views.decorators.cache') def tearDown(self): self.restore_warnings_state() self.default_cache.clear() self.other_cache.clear() Loading Loading @@ -1603,21 +1596,20 @@ class CacheMiddlewareTest(TestCase): request.user = MockAuthenticatedUser() request.session = MockAccessedSession() response = cache_page(hello_world_view)(request, '1') response = cache_page(60)(hello_world_view)(request, '1') self.assertFalse("Cache-Control" in response) def test_view_decorator(self): # decorate the same view with different cache decorators default_view = cache_page(hello_world_view) default_with_prefix_view = cache_page(key_prefix='prefix1')(hello_world_view) default_view = cache_page(3)(hello_world_view) default_with_prefix_view = cache_page(3, key_prefix='prefix1')(hello_world_view) explicit_default_view = cache_page(cache='default')(hello_world_view) explicit_default_with_prefix_view = cache_page(cache='default', key_prefix='prefix1')(hello_world_view) explicit_default_view = cache_page(3, cache='default')(hello_world_view) explicit_default_with_prefix_view = cache_page(3, cache='default', key_prefix='prefix1')(hello_world_view) other_view = cache_page(cache='other')(hello_world_view) other_with_prefix_view = cache_page(cache='other', key_prefix='prefix2')(hello_world_view) other_with_timeout_view = cache_page(3, cache='other', key_prefix='prefix3')(hello_world_view) other_view = cache_page(1, cache='other')(hello_world_view) other_with_prefix_view = cache_page(1, cache='other', key_prefix='prefix2')(hello_world_view) request = self.factory.get('/view/') Loading Loading @@ -1657,10 +1649,6 @@ class CacheMiddlewareTest(TestCase): response = other_with_prefix_view(request, '9') self.assertEqual(response.content, b'Hello World 9') # Request from the alternate cache with a new prefix and a custom timeout response = other_with_timeout_view(request, '10') self.assertEqual(response.content, b'Hello World 10') # But if we wait a couple of seconds... time.sleep(2) Loading Loading @@ -1689,18 +1677,6 @@ class CacheMiddlewareTest(TestCase): response = other_with_prefix_view(request, '16') self.assertEqual(response.content, b'Hello World 16') # ... but a view with a custom timeout will still hit response = other_with_timeout_view(request, '17') self.assertEqual(response.content, b'Hello World 10') # And if we wait a few more seconds time.sleep(2) # the custom timeout cache will miss response = other_with_timeout_view(request, '18') self.assertEqual(response.content, b'Hello World 18') @override_settings( CACHE_MIDDLEWARE_KEY_PREFIX='settingsprefix', CACHE_MIDDLEWARE_SECONDS=1, Loading tests/regressiontests/decorators/tests.py +0 −17 Original line number Diff line number Diff line import warnings from functools import wraps from django.contrib.admin.views.decorators import staff_member_required Loading Loading @@ -116,22 +115,6 @@ class DecoratorsTest(TestCase): my_view_cached2 = cache_page(123, key_prefix="test")(my_view) self.assertEqual(my_view_cached2(HttpRequest()), "response") def test_cache_page_old_style(self): """ Test that we can call cache_page the old way """ def my_view(request): return "response" with warnings.catch_warnings(record=True): my_view_cached = cache_page(my_view, 123) self.assertEqual(my_view_cached(HttpRequest()), "response") my_view_cached2 = cache_page(my_view, 123, key_prefix="test") self.assertEqual(my_view_cached2(HttpRequest()), "response") my_view_cached3 = cache_page(my_view) self.assertEqual(my_view_cached3(HttpRequest()), "response") my_view_cached4 = cache_page()(my_view) self.assertEqual(my_view_cached4(HttpRequest()), "response") def test_require_safe_accepts_only_safe_methods(self): """ Test for the require_safe decorator. Loading Loading
django/views/decorators/cache.py +6 −43 Original line number Diff line number Diff line Loading @@ -18,54 +18,17 @@ def cache_page(*args, **kwargs): Additionally, all headers from the response's Vary header will be taken into account on caching -- just like the middleware does. """ # We need backwards compatibility with code which spells it this way: # def my_view(): pass # my_view = cache_page(my_view, 123) # and this way: # my_view = cache_page(123)(my_view) # and this: # my_view = cache_page(my_view, 123, key_prefix="foo") # and this: # my_view = cache_page(123, key_prefix="foo")(my_view) # and possibly this way (?): # my_view = cache_page(123, my_view) # and also this way: # my_view = cache_page(my_view) # and also this way: # my_view = cache_page()(my_view) # We also add some asserts to give better error messages in case people are # using other ways to call cache_page that no longer work. if len(args) != 1 or callable(args[0]): raise TypeError("cache_page has a single mandatory positional argument: timeout") cache_timeout = args[0] cache_alias = kwargs.pop('cache', None) key_prefix = kwargs.pop('key_prefix', None) assert not kwargs, "The only keyword arguments are cache and key_prefix" def warn(): import warnings warnings.warn('The cache_page decorator must be called like: ' 'cache_page(timeout, [cache=cache name], [key_prefix=key prefix]). ' 'All other ways are deprecated.', DeprecationWarning, stacklevel=2) if kwargs: raise TypeError("cache_page has two optional keyword arguments: cache and key_prefix") if len(args) > 1: assert len(args) == 2, "cache_page accepts at most 2 arguments" warn() if callable(args[0]): return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[1], cache_alias=cache_alias, key_prefix=key_prefix)(args[0]) elif callable(args[1]): return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], cache_alias=cache_alias, key_prefix=key_prefix)(args[1]) else: assert False, "cache_page must be passed a view function if called with two arguments" elif len(args) == 1: if callable(args[0]): warn() return decorator_from_middleware_with_args(CacheMiddleware)(cache_alias=cache_alias, key_prefix=key_prefix)(args[0]) else: # The One True Way return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], cache_alias=cache_alias, key_prefix=key_prefix) else: warn() return decorator_from_middleware_with_args(CacheMiddleware)(cache_alias=cache_alias, key_prefix=key_prefix) return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=cache_timeout, cache_alias=cache_alias, key_prefix=key_prefix) def cache_control(**kwargs): Loading
tests/regressiontests/cache/tests.py +7 −31 Original line number Diff line number Diff line Loading @@ -1478,19 +1478,12 @@ def hello_world_view(request, value): ) class CacheMiddlewareTest(TestCase): # The following tests will need to be modified in Django 1.6 to not use # deprecated ways of using the cache_page decorator that will be removed in # such version def setUp(self): self.factory = RequestFactory() self.default_cache = get_cache('default') self.other_cache = get_cache('other') self.save_warnings_state() warnings.filterwarnings('ignore', category=DeprecationWarning, module='django.views.decorators.cache') def tearDown(self): self.restore_warnings_state() self.default_cache.clear() self.other_cache.clear() Loading Loading @@ -1603,21 +1596,20 @@ class CacheMiddlewareTest(TestCase): request.user = MockAuthenticatedUser() request.session = MockAccessedSession() response = cache_page(hello_world_view)(request, '1') response = cache_page(60)(hello_world_view)(request, '1') self.assertFalse("Cache-Control" in response) def test_view_decorator(self): # decorate the same view with different cache decorators default_view = cache_page(hello_world_view) default_with_prefix_view = cache_page(key_prefix='prefix1')(hello_world_view) default_view = cache_page(3)(hello_world_view) default_with_prefix_view = cache_page(3, key_prefix='prefix1')(hello_world_view) explicit_default_view = cache_page(cache='default')(hello_world_view) explicit_default_with_prefix_view = cache_page(cache='default', key_prefix='prefix1')(hello_world_view) explicit_default_view = cache_page(3, cache='default')(hello_world_view) explicit_default_with_prefix_view = cache_page(3, cache='default', key_prefix='prefix1')(hello_world_view) other_view = cache_page(cache='other')(hello_world_view) other_with_prefix_view = cache_page(cache='other', key_prefix='prefix2')(hello_world_view) other_with_timeout_view = cache_page(3, cache='other', key_prefix='prefix3')(hello_world_view) other_view = cache_page(1, cache='other')(hello_world_view) other_with_prefix_view = cache_page(1, cache='other', key_prefix='prefix2')(hello_world_view) request = self.factory.get('/view/') Loading Loading @@ -1657,10 +1649,6 @@ class CacheMiddlewareTest(TestCase): response = other_with_prefix_view(request, '9') self.assertEqual(response.content, b'Hello World 9') # Request from the alternate cache with a new prefix and a custom timeout response = other_with_timeout_view(request, '10') self.assertEqual(response.content, b'Hello World 10') # But if we wait a couple of seconds... time.sleep(2) Loading Loading @@ -1689,18 +1677,6 @@ class CacheMiddlewareTest(TestCase): response = other_with_prefix_view(request, '16') self.assertEqual(response.content, b'Hello World 16') # ... but a view with a custom timeout will still hit response = other_with_timeout_view(request, '17') self.assertEqual(response.content, b'Hello World 10') # And if we wait a few more seconds time.sleep(2) # the custom timeout cache will miss response = other_with_timeout_view(request, '18') self.assertEqual(response.content, b'Hello World 18') @override_settings( CACHE_MIDDLEWARE_KEY_PREFIX='settingsprefix', CACHE_MIDDLEWARE_SECONDS=1, Loading
tests/regressiontests/decorators/tests.py +0 −17 Original line number Diff line number Diff line import warnings from functools import wraps from django.contrib.admin.views.decorators import staff_member_required Loading Loading @@ -116,22 +115,6 @@ class DecoratorsTest(TestCase): my_view_cached2 = cache_page(123, key_prefix="test")(my_view) self.assertEqual(my_view_cached2(HttpRequest()), "response") def test_cache_page_old_style(self): """ Test that we can call cache_page the old way """ def my_view(request): return "response" with warnings.catch_warnings(record=True): my_view_cached = cache_page(my_view, 123) self.assertEqual(my_view_cached(HttpRequest()), "response") my_view_cached2 = cache_page(my_view, 123, key_prefix="test") self.assertEqual(my_view_cached2(HttpRequest()), "response") my_view_cached3 = cache_page(my_view) self.assertEqual(my_view_cached3(HttpRequest()), "response") my_view_cached4 = cache_page()(my_view) self.assertEqual(my_view_cached4(HttpRequest()), "response") def test_require_safe_accepts_only_safe_methods(self): """ Test for the require_safe decorator. Loading