Skip to content

Commit

Permalink
Fixed #12019 - backwards compatibility issues with cache_page decorator.
Browse files Browse the repository at this point in the history
Thanks to rokclimb15 for the report, and j4mie/rokclimb15 for the patches.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@13864 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
spookylukey committed Sep 21, 2010
1 parent 11aee35 commit 9d6eeee
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
13 changes: 11 additions & 2 deletions django/views/decorators/cache.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ def cache_page(*args, **kwargs):
# my_view = cache_page(123, key_prefix="foo")(my_view) # my_view = cache_page(123, key_prefix="foo")(my_view)
# and possibly this way (?): # and possibly this way (?):
# my_view = cache_page(123, my_view) # 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 # 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. # using other ways to call cache_page that no longer work.
Expand All @@ -45,9 +49,14 @@ def cache_page(*args, **kwargs):
elif callable(args[1]): elif callable(args[1]):
return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)(args[1]) return decorator_from_middleware_with_args(CacheMiddleware)(cache_timeout=args[0], key_prefix=key_prefix)(args[1])
else: 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: 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): def cache_control(**kwargs):
Expand Down
4 changes: 4 additions & 0 deletions tests/regressiontests/decorators/tests.py
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ def my_view(request):
self.assertEqual(my_view_cached(HttpRequest()), "response") self.assertEqual(my_view_cached(HttpRequest()), "response")
my_view_cached2 = cache_page(my_view, 123, key_prefix="test") my_view_cached2 = cache_page(my_view, 123, key_prefix="test")
self.assertEqual(my_view_cached2(HttpRequest()), "response") 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. # For testing method_decorator, a decorator that assumes a single argument.
Expand Down

0 comments on commit 9d6eeee

Please sign in to comment.