Пользователь
0,0
рейтинг
19 мая 2012 в 14:31

Разработка → Django, Staticfiles, Windows и UnicodeDecodeError

Разработчикам, не сидящим все время под windows, но иногда там появляющимся оная операционка частенько преподносит сюрпризы. Столкнувшись с одним из них спешу поделиться, ибо метод лечения крайне неочевиден. На понимание, что ни Django ни ваш код не виноваты может уйти не один час…

Итак, имеется девственно чистая (с точки зрения python'a) винда на которой он никогда не стоял. Ставим. Следом ставим setuptools, инсталлим pip, distribute, virtualenv… Вообщем, создаем минимальное рабочее окружение. Тянем с репозитория наш проект, syncdb, права… Стартуем — OK. А далее, на этапе отдачи контента получаем UnicodeDecodeError в самом неожиданном месте. И при этом вы не просто уверены, а своими глазами можете наблюдать, как ваш проект спокойно работает под никсами и на соседней винде…

Метод лечения:
  • открыть regedit
  • найти там HKEY_CLASSES_ROOT\MIME\Database\Content Type
  • проинспектировать на предмет кириллицы в именах MIME-типов
  • переименовать или прибить данные имена
  • закрыть regedit

ВСЕ!

PS: Пока писал все это — подумал, что виновата все-таки Django. Может кто, хорошо владеющий языком, оформит багреквест?
/xenolog @xenolog
карма
20,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (17)

  • +9
    А это не проблема Django, баг в mimetypes.
    • +3
      ага, значит с переходом на третий питон сама рассосется…
      осталось три-четыре года подождать…
      • 0
        Осенью же выйдет django 1.5 с поддержкой python 3.3
        Да и сейчас уже есть форки django работающие под python 3.2
    • 0
      телепат?
  • 0
    Переводить MIME-типы — какая забота о пользователях, их же все читают!
  • 0
    А это не связано с русскими именами профиля в винде? В своё время когда была подобная проблема (не на моём компьютере), грешил на это, но так и не выяснил этого. Починил правкой какого-то питонячего файла.
  • +3
    У меня была эта проблема. Не найдя решения, решил, что больше никогда в жизни не буду запускать Django из-под Windows и настроил Linux в виртуалке (VirtualBox), а потом настроил внутреннюю сеть между Windows, где по-преднему велось написание кода и верстка, и виртуалкой.

    После этого моя жизнь стала похожа на сказку :) Никаких тебе проблем с компиляцией Python-модулей под Windows, никаких левых ошибок.

    Разработка изначально не велась на Linux потому, что мне не нравится UI и скорость работы моих основных инструментов из-под Linux. На Windows с этим попроще.

    PS: с тех пор я уже успел перелезть на Mac, на котором эта проблема отпала сама собой :)
  • 0
    У меня русские MIME типы появились в реестре после установки QuickTime. И проблема проявляется не только в Django но и в SimpleHTTPServer, и при использовании других модулей.
  • 0
    Довольно давно нашел и описал этот баг. unicodedecodeerror-django. С тех пор на многих форумах засветился. Да и в Google по запросу "django unicodedecodeerror " мой пост 5-й в списке. Так что…
    • 0
      Говорят, что в наше время написать новый баг очень непросто. Скорре всего его уже кто- то когда- то писал. Возможно менее успешно, с хмурым и невзрачным интерфейсом, но он уже был когда-то создан… Наверное это хорошо.

      :)
  • 0
    Кажись такая же ошибка была у меня (Python v2.6), под Vista всё нормально разрабатывал, запусти на WinXP и стала появляться ошибка. Чтобы исправить ошибку, надо сделать следующее:
    В python\lib\site.py есть функция setencoding, замени в условии первый ноль на единицу:

    def setencoding():
      """Set the string encoding used by the Unicode implementation.  The
      default is 'ascii', but if you're willing to experiment, you can
      change this."""
      encoding = "ascii" # Default value set by _PyUnicode_Init()
      if 1:  <<<<<<<<<<<<<-------------------------------------
          # Enable to support locale aware default string encodings.
          import locale
          loc = locale.getdefaultlocale ()
          if loc[1]:
              encoding = loc[1]
      if 0:
          # Enable to switch off string to Unicode coercion and implicit
          # Unicode to string conversion.
          encoding = "undefined"
      if encoding != "ascii":
          # On Non-Unicode builds this will raise an AttributeError...
          sys.setdefaultencoding (encoding) # Needs Python Unicode build !
    
    
    • 0
      > Кажись такая же ошибка была у меня (Python v2.6),

      ваша правда, что в питоне полно таких проблем. а чудо-код, который вы привели, вероятно является квинтэссенцией всего этого. :)

      но баг, описанный в данной статье, касается только 2.7, в котором модуль mimetypes стал обращаться к реестру винды для пополнения собственной базы mime-типов. в предыдущих версиях этого не было, поэтому одно из решений, видимо, будет даунгрейдить python.

      зы: игры с sys.setdefaultencoding() чреваты, поэтому так делать не стоит.
  • +2
    До джанго мне никакого дела, но нашёл у себя в реестре такую прелесть:

    аудио/AMR
    аудио/x-gsm
    видео/x-m4v

    Интересно, какая программа постаралась…
  • 0
    Это всем известный баг, на винде поставьте виртуальную машину с linux и будет вам счастье.
    • 0
      зачем ставить виртуалку, если можно сидеть просто под линуксом или макосью?

      В начале статьи сказано:
      не сидящим все время под windows, но иногда там появляющимся...

      Для данной ситуации ваш совет несколько неприемлим.
  • 0
    Недавно был у меня подобный баг с mimetypes: при вставке свг через тег просто ничего не появлялось( в лисе), а в хроме предлагал загрузить файл. Вылечилось это добавлением:
    mimetypes.add_type(«image/svg+xml», ".svg", True)
    mimetypes.add_type(«image/svg+xml», ".svgz", True)
    в код вьюшки. Может кому поможет.
    • 0
      тег object* Парсер съел тег(

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.