Кодировка файлов на развернутом сервере Django - PullRequest
0 голосов
/ 06 сентября 2018

Я недавно развернул свое приложение Django на предварительно установленном хост-сервере (Red Hat) и после недолгого использования обнаружил ошибку UnicodeEncode после загруженных изображений, которые содержат символы кириллицы (точнее, русского), но сохраняют CharFields данные на русском работают просто отлично.

enter image description here

Однако идентичный код работает без ошибок на моих персональных компьютерах (проверено как в Ubuntu, так и в Windows). После проверки кодировки файлов на сервере выяснилось, что системной кодировкой по умолчанию на хостинге является ANSI, которая является расширением ASCII

screenshot from SSH client

В этот момент я связался со службой технической поддержки, и они заявили, что это может быть ошибка Django, потому что они используют кодировку UTF-8 на своих серверах (Как тогда демонстрирует sys.getfilesystemencoding (), которая унаследована от кодировки ОС, является ASCII? )

Моим другим подозрением были испорченные локали

enter image description here

И это оказалось правдой.

В любом случае, есть ли какая-то причина, по которой это ошибка Django, и это можно исправить с помощью взломов Python / Django, или это полностью ошибка сервера?

Редактировать: Для ясности, это не VDS, это просто обычный хостинг с предустановленной конфигурацией, поэтому я не имею полного контроля над настройками среды, однако я могу настроить файл .htaccess и скрипт .fcgi, так что я считаю, что это Сервер Apache

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Я связался со службой технической поддержки, и они заявили (...), что используют кодировку UTF-8 на своих серверах

Это утверждение спорно в лучшем случае.

В системах linux кодировка имен файлов не задается глобально на уровне файловой системы, а зависит от среды - которая обычно устанавливается для пользователя, но может быть переопределена перед выполнением команды.

Итак, эффективная кодировка fs для вашего приложения django зависит от среды процесса (apache, gunicorn и т. Д.), Который запускает процессы django, и значения, которые вы найдете в своей собственной оболочке python, могут не совпадать с Джанго. Вы не упомянули, как работает ваше приложение django, поэтому невозможно точно сказать вам, где искать, но, по крайней мере, приведенная выше информация должна указывать вам правильное направление.

Во всяком случае, есть ли способ, что это вина Джанго

Полная фигня.

и это можно исправить с помощью хаков Python / Django

Определенно нет. Правильное решение - исправить среду процесса, точка.

0 голосов
/ 06 сентября 2018

Я столкнулся с той же проблемой на моих производственных серверах. Важно развернуть ваше приложение django с правильной кодировкой.

Я использую gunicorn для развертывания и запускаю gunicorn через супервизора. В конфигурации супервизора я определил кодировку:

это мой конфигурационный файл супервизора для приложения django:

[program:django_app]
command = /path/to/gunicorn/start/file                 ; Command to start app
user = matyas                                                     ; User to run as
stdout_logfile = /././logs/gunicorn_supervisor.log     ; Where to write log messages
redirect_stderr = true                                            ; Save stderr in the same log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8                   ; Set UTF-8 as default encoding

линия

environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8  

является важной декларацией. Если вы не используете supervisor, обязательно передайте этот языковой аргумент команде, которая запускает приложение django на вашем сервере.

...