Python Django缓存中的TypeError
更新:请参阅下面的“更好的解决方案” 这件事把我难住了。当我调用Django REST框架生成的HTML页面时,它可以工作。当我第二次、第三次、第四次叫它时,我得到:Python Django缓存中的TypeError,python,django,django-rest-framework,pickle,Python,Django,Django Rest Framework,Pickle,更新:请参阅下面的“更好的解决方案” 这件事把我难住了。当我调用Django REST框架生成的HTML页面时,它可以工作。当我第二次、第三次、第四次叫它时,我得到: [26/Oct/2015 15:14:42]"GET /api/rest/v3/dockets/ HTTP/1.1" 500 92424 Internal Server Error: /api/rest/v3/dockets/ Traceback (most recent call last): File "/home/mli
[26/Oct/2015 15:14:42]"GET /api/rest/v3/dockets/ HTTP/1.1" 500 92424
Internal Server Error: /api/rest/v3/dockets/
Traceback (most recent call last):
File "/home/mlissner/.virtualenvs/courtlistener/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 108, in get_response
response = middleware_method(request)
File "/home/mlissner/.virtualenvs/courtlistener/local/lib/python2.7/site-packages/django/middleware/cache.py", line 134, in process_request
response = self.cache.get(cache_key, None)
File "/home/mlissner/.virtualenvs/courtlistener/local/lib/python2.7/site-packages/django/core/cache/backends/locmem.py", line 54, in get
return pickle.loads(pickled)
TypeError: __new__() takes exactly 3 arguments (2 given)
与我从Django获得的99%的StackTrace不同,这一条根本没有提到我的代码,似乎是Django本身的唯一代码
我使用的是开发服务器Django 1.8.7、Django REST Framework 3.2.3和Python 2.7
我的中间件设置是:
MIDDLEWARE_CLASSES = [
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
我只在查看Django REST框架页面时看到过这一点。有什么想法吗
我尝试过的事情
- 升级Django、djangorestframework和djangorestframework筛选器
- 更改我的
设置,使其使用Redis而不是CACHE
。我认为这可能会有所帮助,因为评论中有人说将其更改为LocMemCache
会有所帮助。对redis的更改本身并没有帮助,尽管将其设置为FileBasedCache
会有帮助DummyCache
看来我是解决问题的高手。但好消息是,这是Django Rest框架中的一个版本,它已经发布了,并且将在3.3.2中发布(希望如此)。很容易理解为什么问题只在第二次访问页面后才会发生。这是因为当您第一次加载页面时,数据从数据源(数据库?)中提取,并写入缓存。之后,每个页面加载将直接命中缓存 问题似乎与缓存的数据类型有关。在
pickle
模块中引发异常,当从字符串加载缓存数据时,取消pickler会错误地检测数据类型,并调用该类的\uuuuuuu new\uuuu
方法。这就是错误发生的地方
有一些帖子讨论pickle卸载错误,看看它们是否有用:
看起来在清除元组时出现了问题,应用程序中缓存的数据是否包含元组?,该元组已修复,并已在3.3.2中发布。版本的Django和DRF?您正在使用django扩展吗?你能发布你的
设置吗?CACHE
?@sax:用这些细节更新了Q,谢谢你的帮助@sax:我没有更改设置。缓存
,所以我想它是未设置的?不确定这是否有帮助,我在缓存
LocMemCache
上遇到了同样的问题,当我移动到FileBasedCache
时,所有这些问题都消失了。不知道为什么,这不是答案,仅供参考。“真奇怪,”萨克斯说。搜索时,我找不到任何其他此类实例。您有相同的Django、REST框架和Python堆栈吗?