Django 1.7.4和django-cacheops 2.2.1之间可能存在的交互问题

时间:2015-02-03 18:08:43

标签: python django django-1.7 django-cache

我正在将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对象而鸭CacheQuerySetQuerySet的期望不完全匹配。

也有可能错误配置了某些内容。以下是相关设置:

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包。

还没有解决方案,但正在努力。

1 个答案:

答案 0 :(得分:1)

您的配置确实存在错误'ops':'count'应拼写为'ops':['count'](无论如何,人们都会这样做,因此下一版本的缓存将会理解这一点)。但是,这不应该导致您收到的错误。

你的问题很可能来自另一个软件包,除了缓存与QuerySet混乱的问题。因此,检查是否有任何猴子补丁或子类。如果__getitem__()被篡改,请特别注意。

如果你不能发现它的来源,我建议你做一些甜蜜的事情"拆除您的项目:删除第三方应用程序和您的代码,直到一切开始工作,然后在最后一步注意。如果它仍然无法工作,那么你可以在github上创建一个问题并附上你项目的左边那些。