Возможная проблема взаимодействия между Django 1.7.4 и 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 атрибут _result_cache должен быть этим списком .

В django-cacheops метод, вызывающий эту функцию self'тип s - 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)?

[EDIT]:

Мой друг смог воспроизвести проблему с минимальным РЕПО . Проблема, кажется, вытекает из пакета django-tracking2.

Пока нет решения, но работаем над ним.

1 2

1 ответ:

Действительно есть ошибка в вашей конфигурации 'ops':'count' должно быть написано как 'ops':['count'] (Люди будут делать это в любом случае, так что следующая версия cacheops поймет это). Это, однако, не должно привести к ошибке, которую вы получаете.

Ваша проблема, скорее всего, исходит из другого пакета, кроме cacheops, возящихся с QuerySet. Так что проверьте, если что-нибудь обезьяна патчи или подклассы его. Обратите особое внимание, если __getitem__() подделан.

Если вы не можете определить, откуда это исходит, я предлагаю вы делаете "дерьмо на сладкое" демонтаж вашего проекта: удаляете сторонние приложения и ваш код, пока все не начнет работать, а затем обращаете внимание на последний шаг. Если он все еще не будет работать, вы можете создать проблему на github и прикрепить туда то, что осталось от вашего проекта.