Как я могу передать 'строку Unicode' в os.environ в wsgi.py

apache environment-variables mod-wsgi python-3.5 django-wsgi

264 просмотра

1 ответ

  • apache2
  • WSGI
  • ВХост
  • python3

Если я пытаюсь установить envvars как часть моего wsgi.py, я сталкиваюсь с проблемами, если значения содержат символы не ascii.

Traceback (most recent call last):
File "/home/vagrant/pyvenv/lib/python3.5/site-packages/absys/config/wsgi.py", line 13, in <module>
os.environ['DJANGO_TESTVAR'] = 'M\xc3\xb6\xc3\xb6\xc3\xb6\xc3\xb6'
File "/usr/lib/python3.5/os.py", line 730, in __setitem__
value = self.encodevalue(value)
File "/usr/lib/python3.5/os.py", line 799, in encode
return value.encode(encoding, 'surrogateescape')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-4: ordinal not in range(128)

Когда я пытаюсь сделать то же самое, что и обычный пользователь или пользователь root, он работает безупречно. Похоже, это связано с тем, что os.environон принимает переданное значение Unicode ('Müüü') и не пытается его кодировать. По непонятной причине то же самое, похоже, не соответствует действительности, когда выполняется как частьwsgi.py

На секунду я подумал , этот вопрос может дать ответ , но установка LANG = de_DE.UTF-8в /etc/apache2/envvarsне меняет.

Я попытался прочитать большую часть ресурсов по django / wsgi / envvars и, в частности, по подходу Грэма Дамплетона, но ни один из них, похоже, не упоминал о проблемах кодирования.

Я предполагаю, что мой вопрос (управляемый моим пониманием до сих пор) сводится к следующему: «Что управляет os.environповедением кодирования и как влиять на него в процессе wsgi?

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

Автор: Elbenfreund Источник Размещён: 04.09.2019 08:24

Ответы (1)


1 плюс

Решение

Этот ответ - всего лишь повторение самого полезного комментария Грэма Дамплтона. Вся заслуга его.

Эта проблема, скорее всего, является результатом неправильной localeнастройки в среде wsgi-процессов.

В случае, если вы mod_wsgiработаете в качестве своего собственного выделенного демона (как это, скорее всего, следует), вы можете передать ему нужную локаль напрямую и, следовательно, избежать каких-либо проблем, связанных с тем, как ваш дистрибутив может обрабатывать среду Apache.

Для этого что - то вдоль этих линий следует сделать трюк: WSGIDaemonProcess my-django-site lang='en_US.UTF-8' locale='en_US.UTF-8'.

Для более сложных объяснений , пожалуйста , прочитайте Grahams отличного пост в блоге и обратитесь к mod_wsgi«s документации .

Автор: Elbenfreund Размещён: 23.01.2017 02:59
Вопросы из категории :
32x32