Django REST Framework: 使用cach_page和drf-extensions進行快取
阿新 • • 發佈:2021-08-13
對於經常被查詢使用而且不怎麼變化的資料, 建議對Django REST Framework(DRF)的響應資料進行快取, 這樣可以避免重複資料庫查詢, 大大加快響應時間。DRF支援兩種資料快取方式: 1. Django的原生cache_page裝飾器; 2.drf-extensions這個第三方庫。
方法1.原生cache_page裝飾器
使用Django提供的method_decorator裝飾器,可以將普通裝飾器比如cache_page應用於類視圖裡。cache_page可以指定快取時間(單位秒)。
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):
#快取特定請求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的狀態碼。
方法2. 使用drf-extensions第三方庫
1. pip安裝
pip install drf-extensions
2. 直接新增cache_response裝飾器
drf-extensions提供的cache_response裝飾器可以直接應用於get方法上,而無需使用method_decorator進行轉換。
from rest_framework_extensions.cache.decorators import cache_response
class UserView(views.APIView):
@cache_response()
def get(self, request, *args, **kwargs):
...
cache_response裝飾器可以接收兩個引數, 一個為快取時間,一個為預設快取後端名字,如下所示:
@cache_response(timeout=60*60, cache='default')
如果不設定引數,可以在settings.py進行預設配置:
#settings.py
# DRF擴充套件
REST_FRAMEWORK_EXTENSIONS = {
# 預設快取時間
'DEFAULT_CACHE_RESPONSE_TIMEOUT': 60 * 60,
# 快取儲存
'DEFAULT_USE_CACHE': 'default',
}
注意,cache_response裝飾器既可以裝飾在類檢視中的get方法上,也可以裝飾在REST framework擴充套件類提供的list或retrieve方法上。
3. 使用drf-extensions提供的擴充套件類
drf-extensions還提供瞭如下3個常用的擴充套件Mixin類,位於rest_framework_extensions.cache.mixins中。
ListCacheResponseMixin
用於快取返回列表資料的檢視,與ListModelMixin擴充套件類配合使用,實際是為list方法添加了cache_response裝飾器
RetrieveCacheResponseMixin
用於快取返回單一資料的檢視,與RetrieveModelMixin擴充套件類配合使用,實際是為retrieve方法添加了cache_response裝飾器
CacheResponseMixin
為檢視集同時補充List和Retrieve兩種快取,與ListModelMixin和RetrieveModelMixin一起配合使用。
最常用的是CacheResponseMixin,它對單個物件或物件列表都進行快取,使用示例如下所示:
from myapps.serializers import UserSerializer
from rest_framework_extensions.cache.mixins import CacheResponseMixin
class UserViewSet(CacheResponseMixin, viewsets.ModelViewSet):
serializer_class = UserSerializer
小結