redis - 如何用Django Rest Framework实现Redis Cache?

标签 redis django-rest-framework django-rest-viewsets

我需要使用我的 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 中。

像下面一样覆盖 ParameterViewSetdispatch,它应该可以完成工作。

@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/

相关文章:

caching - 如何在 C# 中将字典存储在 Redis 缓存/哈希中

django - 注销 Django Rest Framework JWT

django - 使用具有外键的模型序列化器在 Django Rest Framework 中的父表上执行 CRUD

django - Django Rest Framework 中嵌套 URL 的相关资源

python - APIView 的 GET api 测试用例在 djangorestframework 中不起作用

python - Django-filters 不适用于 Viewset

python - python 3.5 中的 json.loads 和 Redis

node.js - 列表值的 redis Node 库 json 序列化

node.js - 检查游戏状态并向连接的客户端发送套接字的正确方法是什么?

Django 2.2+调用rest api,过滤id列表