来自 Django 缓存的类型错误

mli*_*ner 5 python django pickle django-rest-framework

更新:请参阅下面的“更好的解决方案”。

这个难倒我了。当我调用由 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)
Run Code Online (Sandbox Code Playgroud)

与我从 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',
]
Run Code Online (Sandbox Code Playgroud)

我只在查看 Django REST Framework 页面时看到过这一点。有任何想法吗?

我尝试过的事情

  • 升级 Django、djangorestframework 和 djangorestframework-filters。
  • 更改我的CACHE设置,使其使用 Redis 而不是LocMemCache. 我认为这可能会有所帮助,因为评论中有人说将其更改为有FileBasedCache帮助。尽管将其设置为 do,但对 redis 的更改本身并没有帮助DummyCache

解决方案

django-redis-cache允许您设置不同版本的泡菜,因此我对此进行了修补,因为有一个链接暗示了泡菜版本相关。起初,这似乎没有效果,但django-redis(“PICKLE_VERSION 似乎不起作用”)中提交了一个错误,他们很快就修复了。一旦修复,我将 PICKLE_VERSION 设置为 1,问题就解决了。

我还在DRF 中提交了一个错误,看看是否有更好的方法来解决这个问题。但是,我不确定该错误是否存在于我的代码中或 Django 本身中。

更好的解决方案

我似乎是解决方法的大师。但好消息是,这是Django Rest Framework 中的一个错误已修复,并将在 3.3.2 中发布(希望如此)。

mli*_*ner 0

这是 Django Rest Framework 中的一个错误,已修复并已在 3.3.2 中发布。