Как я могу передать "строку Юникода" в os.environ в wsgi.py

  • 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?

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

1 ответ

Решение

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

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

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

Для этого что-то вроде этого должно сделать свое дело: WSGIDaemonProcess my-django-site lang='en_US.UTF-8' locale='en_US.UTF-8',

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

Другие вопросы по тегам