Django REST Framework/DRF 일반

[DRF] 공식 문서 - Caching 정리

bluebamus 2024. 1. 22. 23:25

 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/

 

Caching - Django REST framework

 

www.django-rest-framework.org