1

我有一个使用 Gunicorn 和 nginx 部署的 Django 项目。我还运行了一个 memcached,并设置了 Django 缓存中间件 () 来缓存站点。

使用 DEBUG=True 运行时一切正常,但是当我切换到 DEBUG=False 时,尝试访问该站点时 Gunicorn 日志中出现以下错误:

2013-02-20 16:09:50 [25196] [ERROR] Error handling request
Traceback (most recent call last):
  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/gunicorn/workers/sync.py", line 102, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/django/contrib/staticfiles/handlers.py", line 67, in __call__
    return self.application(environ, start_response)
  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 247, in __call__
    status_text = STATUS_CODE_TEXT[response.status_code]
AttributeError: 'NoneType' object has no attribute 'status_code'

奇怪的是,我在 Django 发送给我的错误电子邮件中收到另一个错误。在这里我得到以下信息:(GZIP 中间件中的错误。wtf?)

Traceback (most recent call last):

  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/django/core/handlers/base.py", line 188, in get_response
    response = middleware_method(request, response)
  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/django/middleware/gzip.py", line 16, in process_response
    if len(response.content) < 200:
  File "/home/toursprung/.virtualenvs/myproject/lib/python2.6/site-packages/django/http/__init__.py", line 699, in _get_content
    return ''.join([str(e) for e in self._container])

UnicodeEncodeError: 'ascii' codec can't encode character u'\x8b' in position 26: ordinal not in range(128)

有人知道为什么会这样吗?

提前致谢, 安东

4

1 回答 1

2

这是我的中间件的订购!

这是我的订单,这是错误的:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'myproject.middleware.StripCookieMiddleware', # fix caching problem with analytics cookies
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    ...
    'django.middleware.cache.FetchFromCacheMiddleware'
)

我把GZipMiddleware右边移到了UpdateCacheMiddleware(好吧,我的小中间件在两者之间去掉了谷歌分析 cookie),现在一切都按预期工作了。

所以这是中间件的正确顺序:

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'myproject.middleware.StripCookieMiddleware', # fix caching problem with analytics cookies
    'django.middleware.gzip.GZipMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    ...
    'django.middleware.cache.FetchFromCacheMiddleware'
)

也许这将在未来帮助某人......

于 2013-02-21T08:53:46.197 回答