Django UnicodeDecodeError во время сообщения об ошибках - PullRequest
0 голосов
/ 24 мая 2019

Сообщения об ошибках постоянно сбой.В трассировке я сначала получаю фактическую ошибку, затем много раз те же

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.6 и Django==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.

На сервере, даже через gunicorn, sys.getdefaultencoding() возврат utf-8, но locale.getpreferredencoding(False) возврат ANSI_X3.4-1968!

Есть идеи?

1 Ответ

0 голосов
/ 27 мая 2019

Язык, который я установил в Gunicorn (fr_FR.UTF8), не был установлен в системе, поэтому каким-то образом Python по умолчанию использовал кодировку ANSI_X3.4-1968.

Решением было установить отсутствующий язык: sudo locale-gen fr_FR.UTF-8

...