Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django缓存中的TypeError_Python_Django_Django Rest Framework_Pickle - Fatal编程技术网

Python Django缓存中的TypeError

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

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

这件事把我难住了。当我调用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/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筛选器
  • 更改我的
    CACHE
    设置,使其使用Redis而不是
    LocMemCache
    。我认为这可能会有所帮助,因为评论中有人说将其更改为
    FileBasedCache
    会有所帮助。对redis的更改本身并没有帮助,尽管将其设置为
    DummyCache
    会有帮助
解决方案 允许您设置不同版本的pickle,因此我对此进行了修改,因为这暗示了pickle版本是相关的。起初,这似乎没有效果,但在django redis中(“PICKLE_版本似乎不起作用”),他们很快就解决了这个问题。修复后,我将PICKLE_版本设置为1,问题就解决了

我还想看看是否有更好的方法来追根究底。但是,我不确定这个bug是在我的代码中还是在Django本身中

更好的解决方案
看来我是解决问题的高手。但好消息是,这是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堆栈吗?