Django Rest框架:Pickle响应
我正在尝试构建一个自定义版本,在这个版本中,我对缓存键有更多的控制权,但我甚至无法使用响应的基本缓存:Django Rest框架:Pickle响应,django,django-rest-framework,django-redis,Django,Django Rest Framework,Django Redis,我正在尝试构建一个自定义版本,在这个版本中,我对缓存键有更多的控制权,但我甚至无法使用响应的基本缓存: from django.core.cache import cache from rest_framework import viewsets from rest_framework.response import Response from app import models class BaseViewSet(viewsets.GenericViewSet): queryset
from django.core.cache import cache
from rest_framework import viewsets
from rest_framework.response import Response
from app import models
class BaseViewSet(viewsets.GenericViewSet):
queryset = models.Items.objects.all()
def get_queryset(self):
return models.Items.objects.all()
def list(self, request, **kwargs):
response = Response({})
cache.set('test', response, 10)
return response
其中mysettings.py的相关部分设置为:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
],
'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.NamespaceVersioning'
}
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": f"redis://127.0.0.1:6729/1",
},
}
当我尝试调用端点时,我得到:
django.template.response.ContentNotRenderedError: The response content must be rendered before it can be pickled.
然后,如果我将行更改为:
cache.set('test', response.render(), 10)
我得到:
AssertionError: .accepted_renderer not set on Response
(如果我设置渲染器,它会抱怨接受的媒体,那么上下文最终会失败,出现TypeError:“bytes”对象不可调用)
尽管API调用本身在没有缓存的情况下运行良好
实际上工作正常,因此我知道可以缓存响应,但我无法找出缺少的内容。我通过让视图返回django.http.JsonResponse
而不是rest\u framework.response.response
对象解决了这个问题。问题在于rest_frameworkResponse
与mediatype无关,据我所知,它依赖于在视图离开处理程序后,将呈现程序和接受的媒体值设置在视图调用链的下游。因为JsonResponse
只处理json,所以它不必经历这个问题。也有同样的问题