Проблемы при деплое Django на виртуальный хостинг на примере jino.ru

Деплой Django на виртуальный хостинг для меня частенько превращается в квест. Это происходит из-за большого количества зависимостей Django от программного системного окружения. Но беда даже не в их количестве, а в том, что существует несколько способов их разрешения. Это красота и боль UNIX-way, воплощенная в python.

Одним из инструментов, призванных облегчить работу в этом хаосе, является виртуальное Python-окружение virtualenv. Да, использование virtualenv безусловно полезная практика, но virtualenv не решает всех проблем. Некоторые python-модули написаны на C и требуют компиляции при установке, а также имеют зависимости от -dev версий системных библиотек. Такие зависимости невозможно разрешить самостоятельно, имея лишь права пользователя виртуального хостинга. Админы же хостинга не всегда считают нужным об этом позаботиться, а времени на переписку с саппортом частенько нет. Один из таких хостингов jino.ru.

Яркий пример таких «проблемных» пакетов жизненно необходимые в большинстве Django проектов mysql-python (MySQLdb) и PIL. Проблему можно попробовать решить, используя ключ —system-site-packages при создании виртуального окружения. И тогда, если тебе немного повезет, в системе уже будут установлены эти пакеты не очень древних версий. Обрати внимание, что поведение по умолчанию в отношении установки системных пакетов у virtualenv менялось с течением времени. Поэтому либо качай и используй свежую версию virtualenv, либо предварительно сверься с документацией к используемой версии.

В моем случае ситуацию дополнительно усложняло то, что я использую более свежий форк PIL-а Pillow, так как PIL уже много лет как заброшен своими мейнтейнерами и не умеет работать с новыми форматами изображений. А Pillow для обратной совместимости маскируется под PIL и импортируется в скрипты под его псевдонимом, что избавляет от правки исходников своих и сторонних пакетов. Таким образом, при наличии PIL в окружении (один из системных пакетов), становится невозможной работа с Pillow.

В случае с Джино, я попал в следующую ситуацию: с одной стороны мне нужны системные пакеты в virtualenv из-за MySQLdb, а с другой нет — из-за PIL. Возможности выборочной установки или деинсталяции системных пакетов в virtualenv на данный момент нет. Проблему решил хладнокровным удалением PIL из myenv/lib/pythonx.x/site-packages.

Не заработал sorl-thumbnail в Ubuntu 12.04

Для ресайза изображений в Django-проектах я пользуюсь батарейкой sorl-thumbnail. Одно из достоинств это приложения — возможность выбора движка для работы с изображениями (по умолчанию PIL). Так вот, после очередного апгрейда Ubuntu, хумбнейлы молча перестали генерироваться.

Даю sorl-thumbnail голос — в settings.py проекта:


THUMBNAIL_DEBUG = True

Вижу причину отказа: IOError: «decoder zip not available». Суть ошибки в том, что в последних версиях Ubuntu (кажется, 11.04) сменилось расположение библиотек libfreetype.so, libjpeg.so и libz.so. А в PIL последней версии эти изменения не учтены. Значит необходимо либо прописать новые пути в setup.py PIL, как описано здесь. Либо поставить симлинки старых путей в системе, как описано здесь. Я выбрал второй вариант, так как ставлю PIL в свое окружение virtualenv для каждого проекта.

Не помешает также установить и все зависимости PIL:


sudo apt-get build-dep python-imaging