Не может объединить объекты 'str' и 'tuple' - Django - johnny cache
Я пытаюсь установить кэш johnny с моего сайта django.
Поэтому я настроил все настройки, связанные с кэшем johnny, вот так:
CACHES = {
'default': {
# 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'BACKEND': 'johnny.backends.memcached.MemcachedCache',
'JOHNNY_CACHE': True,
}
}
Пока что весь проект по-прежнему работает в рабочем режиме. Но сразу после настройки промежуточного программного обеспечения 'johnny.middleware.LocalStoreClearMiddleware'
а также 'johnny.middleware.QueryCacheMiddleware'
Я получаю следующее исключение:
Environment:
Request Method: GET
Django Version: 1.3.1
Python Version: 2.6.6
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'core_knowledge_platform.core_web_service',
'south']
Installed Middleware:
('johnny.middleware.LocalStoreClearMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'johnny.middleware.QueryCacheMiddleware')
Traceback:
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
117. response = middleware_method(request, e)
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/u1/msc/vg55/public_html/core_knowledge_web_platform/core_knowledge_platform/core_web_service/views.py" in __call__
95. return getattr(self, method)(request, *args, **kwargs)
File "/u1/msc/vg55/public_html/core_knowledge_web_platform/core_knowledge_platform/core_web_service/views.py" in GET
673. if not access.validate_user_is_editor(request.user):
File "/u1/msc/vg55/public_html/core_knowledge_web_platform/core_knowledge_platform/core_web_service/business_logic/access.py" in validate_user_is_editor
38. if papergroups:
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in __nonzero__
113. iter(self).next()
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in _result_iter
107. self._fill_cache()
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in _fill_cache
772. self._result_cache.append(self._iter.next())
File "/usr/lib/python2.6/site-packages/django/db/models/query.py" in iterator
273. for row in compiler.results_iter():
File "/usr/lib/python2.6/site-packages/django/db/models/sql/compiler.py" in results_iter
698. row = self.resolve_columns(row, fields)
File "/usr/lib/python2.6/site-packages/django/db/backends/mysql/compiler.py" in resolve_columns
12. return row[:index_extra_select] + tuple(values)
Exception Type: TypeError at /publication/
Exception Value: cannot concatenate 'str' and 'tuple' objects
Примечание: кеш johnny не установлен в INSTALLED_APPS, так как в документации сказано, что он бесполезен
РЕДАКТИРОВАТЬ:
Ну, я обнаружил, что исключение выдается только при попадании в кэш. Когда я жду истечения срока хранения сохраненных в memcached значений, то при загрузке страницы не выдается никаких исключений...
Чтобы добавить больше тени к моей проблеме, когда я запускаю весь проект с активированным johnny в localhost, все работает. Но когда я запускаю его в среде prod (Apache/2.2.15 (CentOS)), возникает исключение... И версия django в обеих средах абсолютно одинакова: 1.3.1
NB: я установил порядок промежуточного программного обеспечения, как указано в okm
Спасибо
2 ответа
У меня была точно такая же проблема. Хотя я все еще пытаюсь докопаться до сути, я нашел несколько полезных вещей.
Старые версии Джонни Кеша работают. Так как мне нужны настройки master / slave, я использовал этот форк: https://bitbucket.org/skoczen/johnny-cache Он включает в себя только коммиты до ноября, поэтому проблема возникает после этого.
На страницах администратора ошибка вызвана кэшем таблицы auth_user и auth_table. Добавление их в JOHNNY_BLACKLIST обходит проблему, а также отключает кэширование для этих таблиц. Я сомневаюсь, что проблема уникальна для этих таблиц, поэтому я внесу эти таблицы в черный список не очень хорошее решение.
Я проверил свою конфигурацию и перепробовал много вещей, как и вы, и это не проблема.
Надеюсь это поможет.
Редактировать: больше копаний выявило, что проблема возникает с этим коммитом bcdb46c5d357, который добавил код для кэширования запросов, возвращающих нуль: https://bitbucket.org/jmoiron/johnny-cache/changeset/bcdb46c5d357
Если вы придерживаетесь более ранней версии, она должна работать.
Тогда причиной ошибки может быть заказ промежуточного программного обеспечения, попробуйте
'johnny.middleware.LocalStoreClearMiddleware',
'johnny.middleware.QueryCacheMiddleware', # Here
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
# Probably you need this for transaction, later
# 'johnny.middleware.CommittingTransactionMiddleware',
'johnny.middleware.QueryCacheMiddleware'
должны быть инициализированы и, таким образом, размещены перед другими промежуточными программами. 'johnny.middleware.LocalStoreClearMiddleware'
только сделки с ответом и исключением, таким образом, это может быть первым.