среда, 7 июля 2010 г.

Ошибка UnicodeDecodeError в демонстрационном проекте Django

Буквально на днях начал осваивать web-программирование. Начать решил с Python 2.7 + Django 1.1. После прочтения введений восхищению не было предела (оно есть до сих пор). 


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

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 280, in run
    self.result = application(self.environ, self.start_response)
  File "C:\Python27\lib\site-packages\django\core\servers\basehttp.py", line 709, in __call__
    mime_type = mimetypes.guess_type(file_path)[0]
  File "C:\Python27\lib\mimetypes.py", line 295, in guess_type
    init()
  File "C:\Python27\lib\mimetypes.py", line 356, in init
    db.read_windows_registry()
  File "C:\Python27\lib\mimetypes.py", line 261, in read_windows_registry
    for ctype in enum_types(mimedb):
  File "C:\Python27\lib\mimetypes.py", line 251, in enum_types
    ctype = ctype.encode(default_encoding) # omit in 3.x!
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128)


Наличие исходников стандартной библиотеки Python-а позволило найти проблему довольно быстро. Я использую Windows XP. В моем случае проблема заключалась в том, что в реестре в разделе [HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] содержались подразделы содержащие в названии кириллицу. При удалении этих разделов они автоматически пересоздавались. Поэтому помогло переименование, просто заменил кириллицу латиницей.

Понятно, что это частный случай и настройки системы. Но возможно, эта заметка позволит кому-нибудь сэкономить время.

--

Mihail 2 ноября 2012 г., 22:06

Для тех у кого в registry Windows 7 нет русских ключей, но проблема осталась - переименуйте сетевое имя компьютера с русского на английский языки.

--


Casufi5 декабря 2012 г., 19:06

Решение исправлением библиотеки: http://softwaremaniacs.org/forum/django/31707/

54 комментария:

  1. Спасибо! Столкнулся с такой же фигней, помогло :)

    ОтветитьУдалить
  2. Спасибо!

    На vista нужно так же удалить русские ключи из:
    HKEY_CLASSES_ROOT\MIME\Database\Content Type

    ОтветитьУдалить
    Ответы
    1. И мне помогло, спасибо. Несмотря на все обновления, ошибка актуальна даже в 2014-м году.
      //Windows 7

      Удалить
    2. Помогло. Спасибо. Windows 7 стоит, а не виста. Так что и для семерки актуально

      Удалить
  3. На XP Sp3 также работает вариант nord_ak

    ОтветитьУдалить
  4. И мне помогло. Спасибо Victor & palanutsa!

    ОтветитьУдалить
  5. Огромное спасибо! 2 дня убил. Теперь всё ok. Действительно, нужно в двух местах убирать кириллицу.

    ОтветитьУдалить
  6. И от меня спасибо! :) Хватило переименования в “HKEY_CLASSES_ROOT\MIME\Database\Content Type” трёх подветок, названия которых начинались с «аудио» и «видео».

    ОтветитьУдалить
  7. Спасибо большое, на XP в “HKEY_CLASSES_ROOT\MIME\Database\Content Type” поменял кирилицу на латиницу - заработало.

    ОтветитьУдалить
  8. Огромное спасибо ваша заметка просто прелесть. Сделал на вас закладку и рекламирую вас в своем блоге.

    ОтветитьУдалить
  9. Windows XP, также пришлось переименовывать строчки, которые указаны автором, + удалить похожие строчки (в этом месте они не переименовывались) в HKEY_CLASSES_ROOT\MIME\Database\Content Type

    ОтветитьУдалить
  10. Уважаемые, скажите, какие строчки (Имя, значение или другое, что) надо удалить? Перерыл всю Весь реестр.
    Куча ключей "(По умалчанию)" со значением "(значение не присвоено)..

    Заранее спасибо

    ОтветитьУдалить
  11. Значения в реестре зависят от того, какое программное обеспечение у Вас установлено. Сказать однозначно из-за какого ключа/значения возникает ошибка можно только имея доступ к вашему компьютеру. В момент возникновения ошибки Вы видите trace и знаете место где возникла ошибка. Можете попробовать добавить в код библиотек вывод ключа реестра (ищите где вызывается read_windows_registry) и тогда будете точно знать ключ.

    ОтветитьУдалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить
  13. Виктор, Спасибо большое.

    Все значения на которых нажимаем F2 находяться здесь HKEY_CLASSES_ROOT\MIME\Database\Content Type

    Конкретный скрин о том что ищем: http://s45.radikal.ru/i109/1101/57/e135b2f35df7.gif

    ОтветитьУдалить
  14. Проблема с именами, а не с значениями. Слева в дереве, там же где audio/... внизу, на этом же уровне, есть ключи с кириллицей в названиях. Их нужно удалить или переименовать.

    ОтветитьУдалить
  15. Спасибо Victor и Николай!
    Мне пришлось менять/удалять в обоих местах.
    Знают ли кодировщики сервера приложений об этой дурацкой ошибке?

    ОтветитьУдалить
  16. Думаю не знают. Чтобы они об этом знали они должны пользоваться во первых Windows, во вторых русской (не английской) редакцией. :) Это маловероятно.

    ОтветитьУдалить
  17. Предлагаю написать им feedback.

    ОтветитьУдалить
  18. На Windows 7 проблема так же решается в ветке HKEY_CLASSES_ROOT\MIME\Database\Content Type

    ОтветитьУдалить
    Ответы
    1. Спасибо автору. На Win 7 помогло удаление в ветке HKEY_CLASSES_ROOT\MIME\Database\Content Type раздеделов с названием "аудио" и "видео"

      Удалить
  19. Большое спасибо! но я испугался лезть в реестр и переустановил Python 2.6 вместо 2.7
    Владимир

    ОтветитьУдалить
  20. Этот комментарий был удален автором.

    ОтветитьУдалить
  21. Присоединяюсь тоже, Спасибо! Помогло.

    ОтветитьУдалить
  22. может лучше просто поменять строкой ниже и вместо
    except UnicodeEncodeError:
    поставить
    except UnicodeDecodeError:

    или я чтото не то говорю?

    ОтветитьУдалить
  23. я имею ввиду корректировку файла
    \Lib\mimetypes.py строка 250

    ОтветитьУдалить
  24. Возможно, Вы правы. Я ограничился тем, что нашел и устранил причину. Исходники не правил.

    ОтветитьУдалить
  25. Огромное спасибо! Под Win7 помогла правка реестра.

    ОтветитьУдалить
  26. Автор, ты крут :)
    Осталось узнать, какая мерзость пишет кириллические ключи в реестр.
    Я очень сильно подозреваю что это Quicktime, ибо ничего мультимедийного кроме него я не ставил в последнее время.

    ОтветитьУдалить
  27. спасибо дяденька, очень выручил.

    ОтветитьУдалить
  28. Слава будде! Нашел эту статью через стек. Там западные мужики эту статью гуглтранслейтяд и чинят. Автор ты известен

    ОтветитьУдалить
  29. проблема есть а ключей в реестре на русском нет :(
    win7

    ОтветитьУдалить
  30. Дико извиняюсь, все нашел исправил GAE завилась!!!
    СПАСИБО

    ОтветитьУдалить
  31. Спасибо. Отличная заметка

    ОтветитьУдалить
  32. Точно, на Win7 сработало.
    Долго мучился, спасибо!

    ОтветитьУдалить
  33. Спасибо автору и комментатору, вот не поленюсь комент написать. Помогло исправление в обеих ветках реестра на вин7

    ОтветитьУдалить
  34. ОГРОМНОЕ СПАСИБО АВТОРУ!
    Два дня мучений окончены!!!

    ОтветитьУдалить
  35. Как вы узнали путь [HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME]?
    У меня нет {4063BE15-3B08-470D-A0D5-B37161CFFD69}...

    ОтветитьУдалить
  36. СПАСИБО!!! очень странно что это еще не описано в самом руководстве!

    ОтветитьУдалить
  37. Спасибо, большое.
    На 7 помогло.

    ОтветитьУдалить
  38. Для тех у кого в registry Windows 7 нет русских ключей, но проблема осталась - переименуйте сетевое имя компьютера с русского на английский языки.

    ОтветитьУдалить
  39. Мне помог этот патч http://bugs.python.org/review/9291/patch/191/354 - замена UnicodeEncodeError на UnicodeError в mimetypes.py:250

    ОтветитьУдалить
    Ответы
    1. этот способ работает. Удаление ключей не помогло. Win7

      Удалить
  40. Решение проблемы а не прикручивание костылей

    http://softwaremaniacs.org/forum/django/31707/

    ОтветитьУдалить
  41. можно кусок mimetypes.py выдрать, чтобы пробовать печатать весь раздел, кода споткнётся берем последнюю напечатанную строку и выбиваем в поиск по реестру.

    import _winreg

    def enum_types(mimedb):

    i = 0
    while True:
    try:
    ctype = _winreg.EnumKey(mimedb, i)
    except EnvironmentError:
    break

    try:
    ctype = ctype.encode() # omit in 3.x!
    except UnicodeEncodeError:
    pass
    else:
    yield ctype
    i += 1


    with _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, '') as hkcr:
    for subkeyname in enum_types(hkcr):
    print subkeyname

    ОтветитьУдалить