【发布时间】:2015-10-26 22:23:41
【问题描述】:
更新:请参阅下面的“更好的解决方案”。
这个让我难过。当我调用由 Django REST Framework 生成的 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/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% 的堆栈跟踪不同,这个根本没有提及我的代码,而且似乎只是来自 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-filters。
- 更改我的
CACHE设置,使其使用Redis 而不是LocMemCache。我认为这可能会有所帮助,因为 cmets 中有人说将其更改为FileBasedCache有帮助。尽管将其设置为DummyCache,但对 redis 的更改本身并没有帮助。
解决方案
django-redis-cache 允许您设置不同版本的泡菜,所以我已经修改了它,因为one link 暗示泡菜版本是相关的。起初,这似乎没有效果,但django-redis 中的I filed a bug (“PICKLE_VERSION 似乎不起作用”),他们很快修复了。修复后,我将 PICKLE_VERSION 设置为 1,问题就解决了。
我也filed a bug in DRF 看看是否有更好的方法来解决这个问题。但是,我不确定该错误是否存在,在我的代码中,还是在 Django 本身中。
更好的解决方案
看来,我是解决方法的大师。但好消息是,这是 Django Rest Framework 中的 bug,它有 been fixed,并将在 3.3.2 中发布(希望如此)。
【问题讨论】:
-
Django 和 DRF 的版本?你在使用 django-extensions 吗?你能发布你的
settings.CACHE吗? -
@sax:用这些细节更新了 Q,感谢您的帮助!
-
@sax:
settings.CACHE我没有改,所以我想它是未设置的? -
不确定这是否有帮助,我在
CACHELocMemCache遇到了同样的问题,当我搬到FileBasedCache时,所有问题都消失了。不知道为什么,这不是答案,仅供参考。 -
呃。这很奇怪,@sax。我在搜索时找不到任何其他实例。你有相同的 Django、REST 框架、Python 堆栈吗?
标签: python django django-rest-framework pickle