我正在将django app从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 function self
的类型为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
包。
还没有解决方案,但正在努力。
答案 0 :(得分:1)
您的配置确实存在错误'ops':'count'
应拼写为'ops':['count']
(无论如何,人们都会这样做,因此下一版本的缓存将会理解这一点)。但是,这不应该导致您收到的错误。
你的问题很可能来自另一个软件包,除了缓存与QuerySet
混乱的问题。因此,检查是否有任何猴子补丁或子类。如果__getitem__()
被篡改,请特别注意。
如果你不能发现它的来源,我建议你做一些甜蜜的事情"拆除您的项目:删除第三方应用程序和您的代码,直到一切开始工作,然后在最后一步注意。如果它仍然无法工作,那么你可以在github上创建一个问题并附上你项目的左边那些。