报错期间的 Django UnicodeDecodeError

Posted

技术标签:

【中文标题】报错期间的 Django UnicodeDecodeError【英文标题】:Django UnicodeDecodeError during error reporting 【发布时间】:2019-10-10 19:34:44 【问题描述】:

错误报告不断崩溃。在回溯中,我首先得到实际错误,然后多次相同

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/utils/deprecation.py", line 94, in __call__
    response = response or self.get_response(request)
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 36, in inner
    response = response_for_exception(request, exc)
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 90, in response_for_exception
    response = handle_uncaught_exception(request, get_resolver(get_urlconf()), sys.exc_info())
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 125, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/views/debug.py", line 94, in technical_500_response
    html = reporter.get_traceback_html()
  File "/var/www/exc2-backend/.venv/lib/python3.6/site-packages/django/views/debug.py", line 332, in get_traceback_html
    t = DEBUG_ENGINE.from_string(fh.read())
  File "/var/www/exc2-backend/.venv/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 9735: ordinal not in range(128)

我正在使用Python3.6Django==2.2。我不明白UnicodeDecodeError 来自哪里。

在生产服务器上运行

from django.test.client import RequestFactory
import sys
from django.views.debug import ExceptionReporter

request = RequestFactory().get('/dummy')
exc_info = sys.exc_info()
reporter = ExceptionReporter(request, is_email=True, *exc_info)
reporter.get_traceback_html()

工作时不会崩溃。

我正在使用 gunicorn 运行我的网站,使用以下命令

/var/www/exc2-backend/.venv/bin/gunicorn exc2_backend.wsgi --name "exc2_backend" --workers=4 --bind=0.0.0.0:8000 --user="www-data" --group="www-data"

我缩小了问题的范围,这发生在这里

from django.views.debug import ExceptionReporter, CURRENT_DIR, DEBUG_ENGINE
from pathlib import Path

with Path(CURRENT_DIR, 'templates', 'technical_500.html').open() as fh:
    data = fh.read()

如果我改成Path(...).open(encoding='utf8'),就没有错误了。

只有在使用 gunicorn 运行代码时,shell 不会发生错误。

在服务器上,即使通过 gunicorn,sys.getdefaultencoding() 返回 utf-8,但 locale.getpreferredencoding(False) 返回 ANSI_X3.4-1968

有什么想法吗?

【问题讨论】:

每当使用错误报告时都会发生这种情况。这样我就不会收到报告错误的电子邮件。我只能通过查看服务器上的日志来查看错误。该网站仍在运行,我或多或少地看到了错误,但我宁愿通过电子邮件获取它们,因为它通常是这样做的。 gunicorn 是否在不同的用户下运行?如果是这样,他们的locale 是什么? 是的,如www-data,但具有相同的语言环境 语言环境是什么? 它是en_US.UTF-8 【参考方案1】:

我在 Gunicorn (fr_FR.UTF8) 中设置的语言环境没有安装在系统上,所以不知何故 Python 默认使用 ANSI_X3.4-1968 编码。

解决方案是安装缺少的语言环境:sudo locale-gen fr_FR.UTF-8

【讨论】:

以上是关于报错期间的 Django UnicodeDecodeError的主要内容,如果未能解决你的问题,请参考以下文章

django 测试期间数据库创建失败

Django:WebSocket 握手期间出错:意外的响应代码:500

在测试期间更改 Django 迁移应用程序的顺序

在 django 测试运行期间避免出现 404 警告?

迁移期间的 Django 问题 - 懒惰的参考

在测试期间,如何覆盖 urlconf 中使用的 Django 设置?