Возможная проблема взаимодействия между 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 ответ:
Действительно есть ошибка в вашей конфигурации
'ops':'count'должно быть написано как'ops':['count'](Люди будут делать это в любом случае, так что следующая версия cacheops поймет это). Это, однако, не должно привести к ошибке, которую вы получаете.Ваша проблема, скорее всего, исходит из другого пакета, кроме cacheops, возящихся с
QuerySet. Так что проверьте, если что-нибудь обезьяна патчи или подклассы его. Обратите особое внимание, если__getitem__()подделан.Если вы не можете определить, откуда это исходит, я предлагаю вы делаете "дерьмо на сладкое" демонтаж вашего проекта: удаляете сторонние приложения и ваш код, пока все не начнет работать, а затем обращаете внимание на последний шаг. Если он все еще не будет работать, вы можете создать проблему на github и прикрепить туда то, что осталось от вашего проекта.