Commits

Anonymous committed 203bd55

Fixed #12019 - backwards compatibility issues with cache_page decorator.

Thanks to rokclimb15 for the report, and j4mie/rokclimb15 for the patches.

Comments (0)

Files changed (2)

django/views/decorators/cache.py

     #   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.
         elif callable(args[1]):
             return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)(args[1])
         else:
-            assert False, "cache_page must be passed either a single argument (timeout) or a view function and a timeout"
+            assert False, "cache_page must be passed a view function if called with two arguments"
+    elif len(args) == 1:
+        if callable(args[0]):
+            return decorator_from_middleware_with_args(CacheMiddleware)(key_prefix=key_prefix)(args[0])
+        else:
+            return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)
     else:
-        return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)
+        return decorator_from_middleware_with_args(CacheMiddleware)(key_prefix=key_prefix)
 
 
 def cache_control(**kwargs):

tests/regressiontests/decorators/tests.py

         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")
 
 
 # For testing method_decorator, a decorator that assumes a single argument.