【问题标题】:cannot concatenate 'str' and 'tuple' objects - Django - johnny cache无法连接“str”和“tuple”对象 - Django - johnny cache
【发布时间】:2012-04-10 14:34:49
【问题描述】:

我尝试在我的 django 网站上安装 johnny cache。

所以我设置了所有与 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 指定的中间件顺序

谢谢

【问题讨论】:

  • 约翰尼的版本是什么?另外,Installed Middleware 中没有'johnny.middleware.QueryCacheMiddleware'
  • 这是回购的最后一个。在底端安装的中间件中有'johnny.middleware.QueryCacheMiddleware'。我认为这是放置它的正确位置,会不会错?

标签: django memcached django-cache


【解决方案1】:

我遇到了完全相同的问题。虽然我仍在尝试深入了解它,但我发现了一些有用的东西。

  1. 旧版本的 johnny 缓存可以工作。由于我需要主/从设置才能工作,所以我使用了这个 fork:https://bitbucket.org/skoczen/johnny-cache 它只包括到 11 月的提交,所以问题是在那之后引入的。

  2. 在管理页面上,错误是由 auth_user 和 auth_table 表缓存引起的。将这些添加到 JOHNNY_BLACKLIST 可以避免该问题,并且还会禁用这些表的缓存。我怀疑这个问题是这些表所独有的,所以我将这些表列入黑名单并不是一个好的解决方案。

我已经检查了我的配置并尝试了很多东西,就像你一样,这不是问题。

希望这会有所帮助。

编辑: 更多挖掘表明,此提交 bcdb46c5d357 出现了问题,该提交添加了代码以缓存返回 null 的查询:https://bitbucket.org/jmoiron/johnny-cache/changeset/bcdb46c5d357

如果你坚持以前的,它应该可以工作。

【讨论】:

  • 好的,我已经拿走了你提到的叉子,现在它似乎可以工作了。我试图深入研究代码并找出问题所在,但无法弄清楚。感谢您的提示
【解决方案2】:

那么中间件的排序可能是错误的原因,试试

'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' 只处理响应和异常,因此它可能是第一个。

【讨论】:

  • 不,它不会改变任何东西,抛出同样的异常。
猜你喜欢
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2013-06-01
  • 1970-01-01
  • 2011-10-23
  • 2015-09-01
相关资源
最近更新 更多