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-Modifieden 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.
- Stelt
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 metmax_agegebruikt)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
3. @vary_on_headers / @vary_on_cookie
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.
댓글이 없습니다.