在django rest框架中缓存响应的正确方法

时间:2016-08-20 20:45:13

标签: caching django-rest-framework

我知道https://github.com/chibisov/drf-extensions,但构建失败了。

如何为通用视图缓存响应?例如:

class PropertyList(generics.ListAPIView):

    queryset = Property.objects.all().prefetch_related("photos")
    serializer_class = PropertyListSerializer


    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('featured', 'state', 'price_cents','location', 'status')
    ordering_fields = ('expiration_date',)

从ListModelMixin实现list方法是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

有一些解决方案:

  • 您可以使用带有cache_pagevary_on_cookie之类的装饰器的APIview和ViewSet缓存。如下所示:

    class UserViewSet(viewsets.Viewset):
    
    # 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)
    

    Django rest original page for caching

  • 中了解有关此内容的更多信息
  • 您也可以按照自己的方式进行操作。我的意思是,您只能使用django中提供的缓存方法,例如cache.set。例如,仅存储方法或查询的结果并存储将来的请求,您可以为它定义一个键,并用cache.set(cache_key, result, expire_time)将该结果设置为该键,然后在需要时获取它。因此,只要该键可以使用缓存,就可以获取其他内容,然后再次从数据库中获取结果并再次存储。

    顺便说一下,它几乎是this link on stackoverflow

  • 的副本

请记住,您应该为结果定义一个缓存后端。默认情况下,您可以使用数据库后端在数据库或文件系统上使用键存储结果。但是,适当且更好的解决方案是根据需要使用消息代理,例如redis或memcached或...。

以下是一些其他有用的链接: