如何使用Django Rest Framework实现Redis缓存?

编程入门 行业动态 更新时间:2024-10-09 10:31:48
本文介绍了如何使用Django Rest Framework实现Redis缓存?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我需要在Django Rest Framework网站上实现Redis缓存。但是当我使用带有类的cache_page装饰器进行负载测试时,每秒可以提高请求,但会出现错误函数对象没有属性'get_extra_actions'。

I need to implement Redis cache with my Django Rest Framework site. But when I do load test using cache_page decorator with a class it improves the request per second but an error occurs "'function' object has no attribute 'get_extra_actions'"

Views.py

@cache_page(CACHE_TTL) class ParameterViewSet(viewsets.ModelViewSet): """ Lists all the parameters present in the system. Can pass filter with parent set to null to get top level Parameters. """ permission_classes = (IsAuthenticated,) queryset = Parameter.objects.all() filter_fields = ('parent', 'target_type',) serializers = { 'default': ParameterSerializer, 'list': ParameterSerializer, 'detail': ParameterSerializer, 'update': ParameterWriteSerializer, 'create': ParameterWriteSerializer, 'delete': ParameterWriteSerializer, } def get_serializer_class(self): return self.serializers.get( self.action, self.serializers['default']) def get_queryset(self): results = Parameter.objects.all().filter(weight__gt=0).order_by( 'order_number') if 'no_parent' in self.request.query_params: return results.filter(parent=None) return results

在我的Settings.py中,我还添加了以下代码。

In my Settings.py, I have also added the below code.

CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } }

我也相应地添加了以下中间件

also i have add the below middleware accordingly

MIDDLEWARE = [ 'django.middleware.cache.UpdateCacheMiddleware', # place all other middlewares here 'django.middleware.cache.FetchFromCacheMiddleware', ]

那也行不通。

推荐答案

从我的头顶开始,您就在使用 @cache_page(CACHE_TTL)在错误的位置以错误的方式。

Just from top of my head you are using the @cache_page(CACHE_TTL) at the wrong place and in the wrong way.

根据django docs',您需要 cache_page 装饰器位于类的方法之上,而不是类本身,并且需要包装在 method_decorator 中。

According to django docs' you need the cache_page decorator to be above class' method not the class itself and it need to be wrapped in method_decorator.

如下所示覆盖 ParameterViewSet 的调度,它应该可以完成工作。 / p>

Overwrite ParameterViewSet's dispatch like below and it should do the job.

@method_decorator(cache_page(CACHE_TTL)) def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)

文档:

  • 装饰类
  • 使用带有apiview和viewset的缓存
  • Decorating the class
  • Using cache with apiview and viewsets

更多推荐

如何使用Django Rest Framework实现Redis缓存?

本文发布于:2023-11-30 21:47:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1651571.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:缓存   如何使用   Django   Rest   Framework

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!