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

Possible interaction issue between Django 1.7.4 and django-cacheops 2.2.1

我正在将 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 与 [=21= 的期望不完全匹配].

也有可能是配置不正确。以下是相关设置:

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

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

你的配置中确实有一个错误 'ops':'count' 应该拼写为 'ops':['count'](无论如何人们都会这样做,所以下一个版本的 cacheops 会理解这一点)。但是,这不应导致您收到错误。

您的问题很可能来自除 cacheops 之外的另一个软件包与 QuerySet 混淆。所以检查是否有任何猴子补丁或子类化它。如果__getitem__()被篡改,请特别注意。

如果您无法确定这是从哪里来的,我建议您 "shit to sweet" 拆除您的项目:删除第三方应用程序和您的代码,直到一切都开始工作,然后在最后注意步。如果它仍然无法正常工作,那么您可以在 github 上创建一个问题并将您的项目剩下的内容附加到那里。