2012-05-01 2 views
12

В веб-приложения (используя колба), я получаю следующее сообщение об ошибке:Странная `UnicodeEncodeError` используя` os.path.exists`

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 

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

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

+0

Не думаю, что это правильное решение, но когда в подобных ситуациях, я считаю, что я использую 'string'.encode (' utf8 ') делает трюк - возможно, стоит сделать снимок. –

+0

Я уверен, что это проблема конфигурации. Поэтому, пока я не выяснил правильную настройку, я просто охранял ее с помощью try/except block, набирая меня электронными письмами каждый раз, когда это происходит: P Это ошибка, и я хочу напомнить об этом :) – exhuma

ответ

17

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

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

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

[...] you must ensure that the environment used to start Apache is configured to accept non-ASCII file names. If your environment is not correctly configured, you will trigger UnicodeEncodeError exceptions when calling functions like the ones in os.path on filenames that contain non-ASCII characters.

To avoid these problems, the environment used to start Apache should contain settings analogous to the following:

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

Consult the documentation for your operating system for the appropriate syntax and location to put these configuration items; /etc/apache2/envvars is a common location on Unix platforms. Once you have added these statements to your environment, restart Apache.

+4

Просто примечание: якорь у вас «Ссылка, похоже, больше не существует в этом URL-адресе. Вместо этого я нашел его здесь: https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#if-you-get-a-unicodeencodeerror –

+3

В 'uwsgi.ini' он не должен содержать кавычки : 'env = LANG = en_US.UTF-8' –

+0

В моем случае я добавил' env = LANG = en_US.UTF-8' в 'uwsgi.ini', в соответствии с https://docs.djangoproject.com/en/DEV/HOWTO/разворачивание/WSGI/uwsgi/# s-конфигурация, и-пуско-на-uwsgi-сервер для-Джанго – shellbye

Смежные вопросы