【问题标题】:Proper way to cache responses in django rest framework在 django rest 框架中缓存响应的正确方法
【发布时间】:2016-12-27 18:23:18
【问题描述】:

我知道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 实现列表方法是唯一的选择吗?

【问题讨论】:

    标签: caching django-rest-framework


    【解决方案1】:

    有一些解决方案:

    • 您可以将 Cache for APIview 和 ViewSets 与 cache_pagevary_on_cookie 等装饰器一起使用。如下:

      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) 的该键,然后随时获取它。因此,如果缓存可用于该键,则获取 else 然后再次从数据库中获取结果并再次存储。

      顺便说一句,它几乎是this link on stackoverflow的复制品

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

    这里还有一些其他有用的链接:

    【讨论】:

    • 似乎不适用于 generics.ListCreateAPIViewget_queryset
    猜你喜欢
    • 2018-12-08
    • 2019-02-19
    • 2020-03-01
    • 2017-03-12
    • 2020-06-17
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多