Als je een Django-ontwikkelaar bent, ben je waarschijnlijk bekend met django.core.cache (server-side cache). Maar Django biedt ook een krachtige toolset voor het effectief beheren van HTTP-caching, genaamd django.utils.cache. Deze module richt zich op het beheren van essentiële HTTP-headers die de serverbelasting verminderen en de gebruikerservaring verbeteren.

In deze post bekijken we de belangrijkste functies en het gebruik van django.utils.cache.


django.core.cache vs django.utils.cache



Uiteenlopende verschillen moeten als eerste worden verduidelijkt.

  • django.core.cache (server-side cache):

    • Slaat resultaten van databasequery's, complexe berekeningen en delen van templates op in servergeheugen (RAM), Redis, Memcached, enz.
    • Doel: Vermindert de rekencapaciteit op de server en versnelt de responstijd.
  • django.utils.cache (HTTP-cache / client-side cache):

    • Stelt Cache-Control, Vary, ETag, Last-Modified en andere HTTP-responsheaders in.
    • Doel: Geeft instructies aan de browser of proxyserver om de respons te cachen, zodat bij herhaalde verzoeken de gecachte respons kan worden gebruikt zonder opnieuw een verzoek naar de server te sturen.

Samengevat, core.cache cache gegevens, terwijl utils.cache het cachen van HTTP-responsen regelt.


Belangrijkste Decorators en Functies

De django.utils.cache module wordt voornamelijk gebruikt in de vorm van decorators die op weergaven (Views) worden toegepast.

1. @cache_control

De meest basale en krachtige decorator voor gedetailleerde controle van de Cache-Control HTTP-header.

  • max_age: De duur waarvoor de cache geldig is (in seconden). De browser gebruikt deze periode de gecachte versie.
  • public=True: Geeft aan dat de respons kan worden opgeslagen in een openbare cache (bijv. CDN, proxy).
  • private=True: Geeft aan dat de respons alleen moet worden opgeslagen in een privécache, zoals die van de gebruiker. (Wordt meestal samen met max_age gebruikt)
  • no_cache: Dwingt de browser om altijd de geldigheid van de cache op de server te controleren voordat deze wordt gebruikt.
  • no_store: Voorkomt dat de respons ooit wordt gecached.

Voorbeeld:

# views.py
from django.utils.cache import cache_control

# Sla de respons van deze view voor 1 uur (3600 seconden) in de browser cache op
@cache_control(max_age=3600)
def my_public_view(request):
    # ...
    return response

# Deze view heeft gevoelige gebruikersinformatie, dus sla deze alleen 30 minuten op in de privécache (browser)
@cache_control(private=True, max_age=1800)
def user_profile_view(request):
    # ...
    return response

2. @never_cache

Zoals de naam al aangeeft, zorgt deze instelling ervoor dat de respons van deze view nooit gecached wordt.

Voegt de header Cache-Control: max-age=0, no-cache, no-store, must-revalidate toe, waardoor de browser sterk wordt geïnstrueerd om geen cache te gebruiken.

Voorbeeld: (meestal gebruikt op betalingspagina's en belangrijke formulierindieningspagina's)

# views.py
from django.utils.cache import never_cache

@never_cache
def sensitive_form_view(request):
    # ...
    return response

Wordt gebruikt voor het instellen van de Vary header. De Vary header speelt een belangrijke rol in het aangeven onder welke voorwaarden de gecachte respons kan variëren.

Bijvoorbeeld, door @vary_on_headers('User-Agent') te gebruiken, kan de cache mobiele en desktop User-Agent onderscheiden en opslaan als ze verschillende HTML-inhoud bieden.

@vary_on_cookie wordt gebruikt wanneer de inhoud van de view afhankelijk is van de waarde van cookies. (Bijv. wanneer het inloggen/uitloggen afhangt van een sessiecookie)

Voorbeeld:

# views.py
from django.views.decorators.vary import vary_on_headers, vary_on_cookie

# Sla de cache afzonderlijk op op basis van User-Agent (mobiel/Desktop) en Accept-Language (taalinstellingen)
@vary_on_headers('User-Agent', 'Accept-Language')
def content_view(request):
    # ...
    return response

# View waarvan de inhoud varieert op basis van cookies (sessie)
@vary_on_cookie
def user_specific_view(request):
    # ...
    return response

Samenvatting



django.utils.cache is een belangrijke module die ervoor zorgt dat Django de HTTP-standaarden goed naleeft en client-side caching op een verfijnde manier kan beheren.

Het goed instellen van Cache-Control en Vary headers is een belangrijke strategie om serververkeer drastisch te verminderen en gebruikers een snellere laadtijd te bieden. Vooral het toepassen van de decorators van deze module op statische inhoud of pagina’s die weinig veranderen, kan leiden tot aanzienlijke prestatieverbeteringen.