Login

A wrapper around cache_page making it optional

Author:
rixx
Posted:
January 22, 2022
Language:
Python
Version:
3.2
Score:
1 (after 1 ratings)

Make cache_page optional, depending on the result of a callable. Uncomment the added lines if you want to make sure that the consumers don't know the page is cached – that means more hits on your end, but also a guarantee that they will always get the newest data asap.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

More like this

  1. Template tag - list punctuation for a list of items by shapiromatron 11 months, 1 week ago
  2. JSONRequestMiddleware adds a .json() method to your HttpRequests by cdcarter 11 months, 2 weeks ago
  3. Serializer factory with Django Rest Framework by julio 1 year, 6 months ago
  4. Image compression before saving the new model / work with JPG, PNG by Schleidens 1 year, 7 months ago
  5. Help text hyperlinks by sa2812 1 year, 7 months ago

Comments

Please login first before commenting.