Django FileField не работает с немецким умлаутом (ä, ö, ü)

Я использую django, nginx и gunicorn.

В моих моделях у меня есть FileField, который не работает с немецким «Umlaute» в производстве.

Когда я пытаюсь загрузить файл (выберите файл и нажмите «сохранить») в /admin с «умлаутом»:

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

модели.py

class wiki(models.Model):

    headline = models.CharField(max_length=255)
    file = models.FileField(null=True, blank=True)

    def __str__(self):
        return self.headline

На веб-сервере разработки на локальном компьютере (./manage runserver) он работает нормально, поэтому я подумал, что это как-то связано с gunicorn или nginx, и безуспешно внес следующие изменения:

/etc/systemd/system/gunicorn.service:

(добавлен --env LANG=de_DE.UTF-8)

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=django
Group=www-data
WorkingDirectory=/opt/django/project
ExecStart=/opt/django/bin/python3 /opt/django/bin/gunicorn --env LANG=de_DE.UTF-8 --workers 3 --bind unix:/opt/django/gunicorn.sock uhd.wsgi:application

[Install]
WantedBy=multi-user.target

/etc/nginx/доступные сайты/домен

server {
    charset UTF-8;
}

Вот некоторая информация, которая, я думаю, может быть полезной:

$ локаль

LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_PAPER="C.UTF-8"
LC_NAME="C.UTF-8"
LC_ADDRESS="C.UTF-8"
LC_TELEPHONE="C.UTF-8"
LC_MEASUREMENT="C.UTF-8"
LC_IDENTIFICATION="C.UTF-8"
LC_ALL=C.UTF-8

кот /etc/*-релиз

PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

Я ценю любую помощь. Если требуется дополнительная информация, пожалуйста, дайте мне знать.


person fuser60596    schedule 31.07.2017    source источник
comment
Python 2.x верно? def __str__(self): должно быть def __unicode__(self):   -  person allcaps    schedule 01.08.2017
comment
на самом деле это Python 3.5.3 в разработке и Python 3.4.2 в производстве.   -  person fuser60596    schedule 01.08.2017
comment
Я никогда не понимаю, почему разработчики хотят использовать два разных Python для prd и dev. В вашем случае это вряд ли связано с вашей проблемой. Но это плохая практика. Нетрудно установить несколько Python. Так что нетрудно поддерживать совершенно одно и то же развитие и производство.   -  person allcaps    schedule 01.08.2017
comment
Вот почему я обновил свое производство, и это, похоже, решило проблему.   -  person fuser60596    schedule 01.08.2017


Ответы (1)


Я обновился с Debian Jessie (старая стабильная версия) до Debian Stretch (стабильная версия), и теперь все работает.

Python был обновлен с Python 3.4.2 до Python 3.5.3. $ locale по-прежнему дает тот же результат, gunicorn и nginx по-прежнему такие же, как показано в вопросе.

$ cat /etc/*-релиз

PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
person fuser60596    schedule 31.07.2017