При обслуживании приложения django через сервер apache и сервер разработки получается разная кодировка символов

У меня следующая установка: Django: 4.0.5 Python: 3.9.2 Debian: 11.1 Apache2: 2.4.53-1~deb11u1 libapache2-mod-wsgi-py3: 4.7.1-3+b1 mariadb-server-10.5: 1:10.5.15-0+deb11u1 .

Когда я запускаю свое приложение с сервера разработки (тот же virtualenv, тот же код), оно работает без ошибок, но когда я запускаю то же самое через apache2, оно выдает какую-то ошибку кодировки здесь:

strx = 'sth %s' % name
f = open('/tmp/somerandomfile', 'w')
f.write(strx)

. Переменная имени поступает из базы данных и содержит национальный символ.

Когда я печатаю его через сервер разработки и apache2, я получаю следующее:

#development server - to the console
print(strx, type(strx))
Kiadások <class 'str'>

#apache2 - to the apache log file
print(strx, type(strx))
Kiad\xc3\xa1sok <class 'str'>

. Таким образом, похоже, что 2 строки отличаются в кодировке.

Сервер разработки обслуживается с 200, однако apache2 serve не работает со следующей ошибкой:

UnicodeEncodeError: 'ascii' codec can't encode character '\\xe1' in position 5: ordinal not in range(128)

Исправить это легко, однако, меня скорее интересует, почему я получаю разный результат через сервер разработки и apache2? Как я могу настроить его так, чтобы результат был одинаковым.

Как уже упоминалось, я использую wsgi.

Есть идеи, где я могу проверить различия? И как я могу получить точно такое же поведение на Apache2, обслуживающем сервер разработки django?

Спасибо.

Вообще-то стоит проверить результат sys.getfilesystemencoding() .

На apache2 он выдает ascii, на dev-сервере - utf-8 .

Итак, чтобы решить проблему, вам нужно добавить что-то вроде этого в /etc/apache2/envvars:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

. Это должно помочь на debian.

Ссылка на похожую проблему:

https://groups.google.com/g/modwsgi/c/MRsMc9yehBI?pli=1

.

Вернуться на верх