def conditional_cache_page(timeout, condition, *, cache=None, key_prefix=None): """This decorator is exactly like cache_page, but with the option to skip the caching entirely. The second argument is a callable, ``condition``. It's given the request and all further arguments, and if it evaluates to a true-ish value, the cache is used. """ def decorator(func): def wrapper(request, *args, **kwargs): if condition(request, *args, **kwargs): response = cache_page( timeout=timeout, cache=cache, key_prefix=key_prefix )(func)(request, *args, **kwargs) # If you don't want consumers to know that the page is cached, add these: # response.headers.pop("Expires") # response.headers.pop("Cache-Control") return func(request, *args, **kwargs) return wrapper return decorator