3

I'm using redis for caching in a django app. I'm also using Django Rest Framework, and here is my problem.

I'm using the cache system like this:

from django.views.decorators.cache import cache_page

urlpatterns = [
...
    url(r'^some_url/$', cache_page(CACHE_TTL)(SomeView.as_view())
...
]

Here, SomeView is a class that inherits from APIView.

Now imagine we make a request to this url and we receive a json object containing one instance of whatever this url returns.

Then we proceed to delete (using django's admin interface) that object, and make the request again. The expected result is an empty json object, but what I'm receiving is the same object unchanged, the same happens if a new object is added, the response still only one object.

After some time (the TTL of the request in cache) the result is correct.

So, how can I tell django that a cache entry it is no valid any more?

Raydel Miranda
  • 13,825
  • 3
  • 38
  • 60
  • Possible duplicate of [Expire a view-cache in Django?](http://stackoverflow.com/questions/2268417/expire-a-view-cache-in-django) – alazaro Nov 02 '16 at 16:42
  • 1
    @alzaro, It is not the same question, is true the answer of the question you're referencing solve my problem, but the original problem is not the same. I'dont want **to expire the cache**, I want the **cache get updated**. – Raydel Miranda Nov 03 '16 at 13:32

1 Answers1

3

From Django’s cache framework:

There are a few other ways to control cache parameters. For example, HTTP allows applications to do the following:

  • Define the maximum time a page should be cached.

  • Specify whether a cache should always check for newer versions, only delivering the cached content when there are no changes. (Some caches might deliver cached content even if the server page changed, simply because the cache copy isn’t yet expired.)

In Django, use the cache_control view decorator to specify these cache parameters. In this example, cache_control tells caches to revalidate the cache on every access and to store cached versions for, at most, 3,600 seconds:

from django.views.decorators.cache import cache_control

@cache_control(must_revalidate=True, max_age=3600)
def my_view(request):
    # ...

If the page you're caching varies frequently and you want to present those changes immediately (and you cache do not detect or check for changes automatically) without waiting for cache TTL, use cache_control.

Raydel Miranda
  • 13,825
  • 3
  • 38
  • 60