【发布时间】:2015-02-03 18:08:43
【问题描述】:
我正在将 django 应用程序从 1.6 升级到 1.7。该应用程序使用django-cacheops 来存储查询结果。切换到 Django 1.7 后,除第一个请求外,所有请求都会引发以下错误:
Traceback (most recent call last):
File "/data/virtualenv/default/lib/python2.7/site-packages/django/core/handlers/base.py", line 204, in get_response
response = middleware_method(request, response)
File "/data/virtualenv/default/lib/python2.7/site-packages/tracking/middleware.py", line 131, in process_response
visitor = self._refresh_visitor(user, request, now)
File "/data/virtualenv/default/lib/python2.7/site-packages/tracking/middleware.py", line 60, in _refresh_visitor
visitor = Visitor.objects.get(pk=session_key)
File "/data/virtualenv/default/lib/python2.7/site-packages/cacheops/query.py", line 398, in get
return self.get_queryset().inplace().get(*args, **kwargs)
File "/data/virtualenv/default/lib/python2.7/site-packages/cacheops/query.py", line 295, in get
return qs._no_monkey.get(qs, *args, **kwargs)
File "/data/virtualenv/default/lib/python2.7/site-packages/django/db/models/query.py", line 353, in get
return clone._result_cache[0]
AttributeError: 'list' object has no attribute '_result_cache'
当AttributeError 被提出时,clone 是一个包含单个项目的列表,但它是django.db.models.query the attribute _result_cache to be that list。
在django-cacheops method that calls that functionself的类型是CacheQuerySet。
我怀疑这个问题的根源是django 代码需要一个QuerySet 对象,而鸭子CacheQuerySet 与QuerySet 的预期不太匹配。
也有可能配置不正确。以下是相关设置:
CACHEOPS_REDIS = {
'host': 'localhost',
'port': 6379,
'db': 10,
'socket_timeout': 3,
}
CACHEOPS = {
'core.vantageuser': {'ops':'count', 'timeout':60*2},
'core.banditarm': {'ops':'all', 'timeout':60*2},
'core.armmembership': {'ops':'all', 'timeout':60*60*2},
}
CACHEOPS_FAKE = False
CACHEOPS_DEGRADE_ON_FAILURE = True
这是一个应该报告给django-cacheops 的真实问题吗?任何人有任何想法绕过这个问题(设置CACHEOPS_FAKE=True除外)?
[编辑]:
My friend was able to replicate the issue with a bare minimum repo。问题似乎源于django-tracking2 包。
尚无解决方案,但正在努力。
【问题讨论】:
-
解决办法是停止使用
django-tracking2,它坏了。无论如何,它复制了 cacheops 所做的事情。
标签: python django django-1.7 django-cache