1. 程式人生 > 其它 >Django REST Framework: 使用cach_page和drf-extensions進行快取

Django REST Framework: 使用cach_page和drf-extensions進行快取

對於經常被查詢使用而且不怎麼變化的資料, 建議對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_pagefrom django.views.decorators.vary import vary_on_cookie, vary_on_headers
from rest_framework.response import Responsefrom rest_framework.views import APIViewfrom 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

小結

Django REST Framework(DRF)提供了2種對經常查詢使用卻又不怎麼變化的響應資料進行快取的方法: 1. Django的原生cache_page裝飾器; 2.drf-extensions這個第三方庫。個人優先推薦drf-extensions提供的CacheResponseMixin這個Mixin類。