Возможная проблема взаимодействия между 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 и прикрепить туда то, что осталось от вашего проекта.