Подтвердить что ты не робот

Strange `UnicodeEncodeError`, используя` os.path.exists`

В веб-приложении (с использованием Flask) появляется следующая ошибка:

Unable to retrieve the thumbnail for u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg'
Traceback (most recent call last):
 File "/var/www/beta/env/lib/python2.7/site-packages/dblib-1.0dev3-py2.7.egg/dblib/orm/file.py", line 169, in get_thumbnail
   if not exists(filename):
 File "/usr/lib/python2.7/genericpath.py", line 18, in exists
   os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xb4' in position 52: ordinal not in range(128)

Обратите внимание, что я включаю repr() имени файла в зарегистрированную ошибку. Это показывает, что имя файла передается как экземпляр Unicode. Так много правильного...

Если я запустил преступника с помощью интерпретатора python, он работает как ожидалось:

>>> from os.path import exists
>>> exists(u'/var/data/uploads/2012/03/22/12 Gerd\xb4s Banjo Trio 1024.jpg')
True

Таким образом, очевидно, что, работая в среде Flask, Python считает, что он должен кодировать имя файла с использованием кодека ASCII вместо UTF-8. Я развернул приложение, используя mod_wsgi за Apache httpd.

Я предполагаю, что я должен сказать одному из них, чтобы где-то использовать UTF-8? Но где?

4b9b3361

Ответ 1

См. документы Django для одной и той же проблемы. При использовании mod_wsgi должно быть такое же решение:

https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror

Выдержка из вышеуказанного связанного документа:

[...] вы должны убедиться, что среда, используемая для запуска Apache, настроен для приема имен файлов, отличных от ASCII. Если ваша среда не правильно настроена, вы будете вызывать исключения UnicodeEncodeError при вызове функций, подобных тем, что указаны в os.path для имен файлов, которые содержат символы, отличные от ASCII.

Чтобы избежать этих проблем, среда, используемая для запуска Apache, должна содержат настройки, аналогичные следующим:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

Обратитесь к документации для вашей операционной системы для соответствующий синтаксис и местоположение для размещения этих элементов конфигурации; /etc/apache2/envvars является общим местом на платформах Unix. однажды вы добавили эти утверждения в свою среду, перезапустите Apache.