我尝试在我的django网站上安装johnny缓存。
所以我设置了所有与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
注意:未在INSTALLED_APPS中设置johnny缓存,因为文档说它没用了
修改:
好吧,我发现只有在有缓存命中时才抛出异常。 当我等待memcached中存储的值过期时,那么在加载页面时,不会抛出任何异常......
要为我的问题添加更多阴影,当我在localhost中激活johnny运行整个项目时,一切正常。但是当我在prod环境(Apache / 2.2.15(CentOS))中运行它时,会抛出异常...... 和两个环境上的django版本完全相同:1.3.1
注意:我已经按照okm
的规定设置了中间件订单谢谢
答案 0 :(得分:1)
我遇到了完全相同的问题。虽然我仍然试图找到它的确切底部,但我发现了一些有用的东西。
较早版本的johnny缓存工作。由于我需要主/从设置才能工作,我使用了这个分支:https://bitbucket.org/skoczen/johnny-cache它只包括截至11月的提交,所以之后会引入问题。
在管理页面上,错误是由auth_user和auth_table表缓存引起的。将这些添加到JOHNNY_BLACKLIST可以避免这个问题,并且还会禁用这些表的缓存。我怀疑这些表格的问题是独一无二的,所以我将这些表格列入黑名单并不是一个好的解决方案。
我检查了我的配置并尝试了很多东西,就像你一样,这不是问题所在。
希望这有帮助。
编辑: 更多挖掘表明该问题突然出现了这个提交bcdb46c5d357,它添加了代码来缓存返回null的查询:https://bitbucket.org/jmoiron/johnny-cache/changeset/bcdb46c5d357
如果你坚持使用早期版本,它应该有用。
答案 1 :(得分:0)
然后中间件的排序可能是错误的原因,请尝试
'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'
仅处理w /响应和异常,因此它可能是第一个。