对于如今的动态网站来说,全部的界面展现都是经过客户端请求服务端,服务端再去请求数据库,而后将请求到的数据渲染后返回给客户端。用户每次访问页面都须要去请求数据库,若是同时有多我的访问的话,对于咱们的数据库的压力是至关大的。html
因此咱们会想,对于不是常常变动的数据,或者不须要实时更新展现的数据,咱们能够将数据存放在缓存中,用户下次须要数据的时候,服务端直接从缓存中拿到数据返回给用户便可,不须要每次都去数据库查询,这样会大大下降数据库的压力,提高用户访问速度。git
Django提供了多种缓存方法,具体能够参考:https://docs.djangoproject.com/zh-hans/2.1/topics/cache/github
下面咱们来看看DRF缓存,它对Django的缓存进行了一层封装,使咱们用起来更加方便redis
一、使用drf-extensions数据库
Django REST Framework中使用缓存,可使用GitHub上提供的drf-extensions扩展来实现django
GitHub地址:https://github.com/chibisov/drf-extensionswindows
参考文档:http://chibisov.github.io/drf-extensions/docs/#caching缓存
drf-extensions 缓存工做原理:函数
收到用户请求时,会根据请求对应的 view_instance, view_method, request, args, kwargs 等生成一个key,而后经过这个key去内存中查找是否有对应的value,若是有value,将其封装成对应的response返回给客户端网站
若是经过key没有找到对应的value,则去执行咱们的视图函数对应的方法,并将结果做为key值保存在内存中,以便下次使用。
1)安装drf-extensions:pip install drf-extensions
2)使用方法:
首先须要安装 drf-extensions 库:pip install drf-extensions
1)使用装饰器方式
@cache_response
它适用于继承了rest_framework.views.APIView的类,且须要返回一个rest_framework.response.Response的实例
用法以下:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framwork_extensions.cache.decorator import cache_response class GoodListView(APIView): @cache_response() def get(self, request, format=None): goods = Goods.objects.all()[:10] goods_serializer = GoodListSerializer1(goods, many=True) return Response(goods_serializer.data)
第一次访问goods接口,看到使用的时间是1.44s
而后咱们再次刷新界面,看到goods接口只是用了259ms
@cache_response()接受4个参数
a)timeout:指定过时时间,单位为秒,即缓存有效期时间。默认为None,即永久缓存,咱们也能够在设置文件中修改此参数
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15 # 即指定有效期为15分钟
}
b)key_func:指定缓存键,默认状况下,每一个来自@cache_response装饰器的缓存数据都由key存储,使用DefaultKeyConstructor计算
c)cache:指定装饰器在缓存结果时使用特定的缓存,通常状况下,咱们会直接使用默认的default 缓存
d)cache_errors:默认状况下,每一个response都会被缓存,包括错误,因此若是咱们第一次请求的时候中间出现错误,那么在缓存有效期内,每一次的请求都将会直接将以前缓存的错误信息返回给咱们。
咱们能够经过修改cache_errors的值为False来改变这种行为。
REST_FRAMEWORK_EXTENSIONS = {
'DEFAULT_CACHE_RESPONSE_TIMEOUT':60*15, # 即指定有效期为15分钟
‘DEFAULT_CACHE_ERRORS’:False
}
2)使用CacheResponseMixin
用于缓存标准视图retrieve和list方法。和viewset搭配使用。
CacheResponseMixin本质上也是使用@Cache_response()装饰器实现,在它的基础上进行了进一步封装,使得使用更加便捷
mixin的示例使用方法:
from rest_framework_extensions.cache.mixins import CacheResponseMixin class GoodListView3(CacheResponseMixin,mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet): queryset = Goods.objects.all().order_by("add_time") serializer_class = GoodListSerializer1 pagination_class = GoodPageView
只须要将CacheResponseMixin加入到咱们的试图类函数第一个继承类位置便可。
查看rest_framework_extensions.cache.mixins,能够看到,它下面提供了四个类:
BaseCacheResponseMixin:公共类,只是指定了默认的缓存键功能
ListCacheResponseMixin:继承自BaseCacheResponseMixin,针对list方法缓存
RetrieveCacheResponseMixin:针对retrieve方法缓存
CacheResponseMixin:继承了ListCacheResponseMixin和RetrieveCacheResponseMixin,即既能够对list也能够针对retrieve方法进行缓存。
二、使用redis缓存(Django-redis)
参考文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/
GitHub:https://github.com/niwinz/django-redis
1)须要安装django-redis:pip install django-redis
2)配置:
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
若是有密码的话,能够在url中:LOCATION:'redis://:password@ip:port',也能够配置在OPTIONS中
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD":"password" }
3)具体redis的安装及配置,能够见以前的博客 Linux下redis的安装及配置 或 windows下redis安装及配置