2

我正在将 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的属性_result_cache

django-cacheops调用该函数 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)?

[编辑]:

我的朋友能够以最低限度的 repo 复制该问题。问题似乎源于django-tracking2包裹。

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

4

1 回答 1

1

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

您的问题很可能来自另一个包,除了 cacheops 和QuerySet. 因此,请检查是否有任何猴子修补或子类化它。__getitem__()如果被篡改,请特别注意。

如果你不知道这是从哪里来的,我建议你对你的项目进行“大便”的拆解:删除第三方应用程序和你的代码,直到一切开始工作,然后注意最后一步。如果它仍然不起作用,那么您可以在 github 上创建一个问题并将您的项目剩下的内容附在此处。

于 2015-02-04T02:53:33.300 回答