[DRF] 공식 문서 - Caching 정리
1. Caching
1) APIView와 Viewsets와 함께 캐시 사용(Using cache with apiview and viewsets)
- Django는 클래스 기반 뷰에서 데코레이터를 사용하기 위해 method_decorator를 제공한다. 이를 다른 캐시 데코레이터인 cache_page, vary_on_cookie, vary_on_headers와 함께 사용할 수 있다.
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_cookie, vary_on_headers
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import viewsets
class UserViewSet(viewsets.ViewSet):
# With cookie: cache requested url for each user for 2 hours
@method_decorator(cache_page(60 * 60 * 2))
@method_decorator(vary_on_cookie)
def list(self, request, format=None):
content = {
"user_feed": request.user.get_user_feed(),
}
return Response(content)
class ProfileView(APIView):
# With auth: cache requested url for each user for 2 hours
@method_decorator(cache_page(60 * 60 * 2))
@method_decorator(vary_on_headers("Authorization"))
def get(self, request, format=None):
content = {
"user_feed": request.user.get_user_feed(),
}
return Response(content)
class PostView(APIView):
# Cache page for the requested url
@method_decorator(cache_page(60 * 60 * 2))
def get(self, request, format=None):
content = {
"title": "Post title",
"body": "Post content",
}
return Response(content)
- 참고: cache_page 데코레이터는 GET 및 HEAD 요청에 대해 상태 코드 200으로 응답되는 경우에만 캐시한다.
1. cache_page
- cache_page는 뷰의 응답을 캐싱하여 이후 동일한 요청에 대해 캐시된 응답을 반환한다.
- 캐싱은 지정된 시간 동안 유지되고, 이 기간 동안 동일한 요청에 대해서는 서버에 다시 액세스하지 않는다.
- 주로 빈번하게 변경되지 않는 정적인 컨텐츠에 사용된다.
- cache_page의 인자로는 캐시 유지 시간을 지정할 수 있다.
2. vary_on_cookie
- vary_on_cookie는 쿠키 값을 기준으로 캐시된 응답을 구별한다.
- 쿠키 값이 다를 경우에는 서로 다른 캐시된 응답을 반환한다.
- 예를 들어 로그인 상태와 비로그인 상태에서 다른 캐시를 사용하고자 할 때 유용하다.
3. vary_on_headers
- vary_on_headers는 특정 헤더 값을 기준으로 캐시된 응답을 구별한다.
- 헤더 값이 다를 경우에는 서로 다른 캐시된 응답을 반환한다.
- 예를 들어 언어 설정이나 사용자 에이전트 정보에 따라 다른 캐시를 사용하고자 할 때 유용하다.
from django.views.decorators.cache import cache_page
from django.utils.decorators import method_decorator
from rest_framework.views import APIView
from rest_framework.response import Response
class MyAPIView(APIView):
@method_decorator(cache_page(60)) # 60초 동안 응답을 캐싱합니다.
def get(self, request):
data = {
'message': 'Hello, world!',
'count': 10,
'results': ['item1', 'item2', 'item3']
}
return Response(data)
@method_decorator(cache_page(60)) # 60초 동안 응답을 캐싱합니다.
@method_decorator(vary_on_cookie) # 쿠키 값을 기준으로 캐시된 응답을 구별합니다.
@method_decorator(vary_on_headers('Accept-Language')) # 'Accept-Language' 헤더 값을 기준으로 캐시된 응답을 구별합니다.
def post(self, request):
# 요청 처리 로직을 구현합니다.
name = request.data.get('name')
age = request.data.get('age')
message = f"Hello, {name}! You are {age} years old."
data = {
'message': message
}
return Response(data)
- 공식 사이트 문서 : https://www.django-rest-framework.org/api-guide/caching/