作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我需要使用我的 Django Rest Framework 站点实现 Redis 缓存。但当我使用带有类的 cache_page 装饰器进行负载测试时,它提高了每秒的请求但发生错误“'function' 对象没有属性 'get_extra_actions'”
View .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 中,我还添加了以下代码。
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
我还相应地添加了以下中间件
MIDDLEWARE = [
'django.middleware.cache.UpdateCacheMiddleware',
# place all other middlewares here
'django.middleware.cache.FetchFromCacheMiddleware',
]
那也行不通。
最佳答案
就在我的脑海中,你在错误的地方以错误的方式使用了 @cache_page(CACHE_TTL)
。
根据 django 文档,您需要 cache_page
装饰器位于类方法之上,而不是类本身,并且需要将其包装在 method_decorator
中。
像下面一样覆盖 ParameterViewSet
的 dispatch
,它应该可以完成工作。
@method_decorator(cache_page(CACHE_TTL))
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
文档:
关于redis - 如何用Django Rest Framework实现Redis Cache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56038304/
我是一名优秀的程序员,十分优秀!