Как я могу передать "строку Юникода" в 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
Документация.