среда, 30 мая 2012 г.

django: flatpages error "Cannot use None as a query value" (En)

If you see "Cannot use None as a query value" error message in Django admin tying to save new Flatpage object, then just fill all mandatory fields. Probable you forgot to specify 'site' field.
It's very strange not to see standart django error message but the stack trace.. And it's a bug in Flatpages field validation code.
Moreover, this bug has been fixed (Ticket #18324).
p.s. stable version (c)

понедельник, 28 мая 2012 г.

django-lfs: опыт использования. часть 1 ( установка )

Потребовалось сделать небольшой проект - интернет-магазин на django.
Остановил свой выбор на решении django-lfs.
Беглый осмотр исходников навел на мысль о том, что поддержки новой django 1.4 пока нет - взять хотя бы структуру проекта. Она явно не соответствует той структуре , которую создает django_admin.
Также вижу, что в settings.py не все так, как принято теперь в дефолтном джанго-приложении.
Есть соблазн использовать django 1.3, но спортивный интерес и желание разобраться со всеми проблемами совместимости, которые вылезут, подталкивает начинать именно с 1.4...
Итак, что у нас имеется?
  1. Linux Debian Lenny 32 bit
  2. Python 2.7
  3. virtualenv
  4. django-lfs-installer-0.7.4.tar.gz
  5. MySQL
Сразу готовимся с будущему копипасту )) Создаем фейковый проектик из-под django 1.4 для того, чтобы под рукой иметь эталон. Очень будет полезно для приведения lfs-ного settings к потребному для 1.4 виду. Сделали? Двигаемся дальше.
Далее создадим бд (предполагается что сервер mysql уже крутится на сервере). Логинимся на локальный mysql-сервер под рутом субд и выполняем sql:

--создание базы данных
create database shop_db;
--создание пользователя и выдача ему всех прав на эту бд
grant all privileges on shop_db.* to shop_admin@localhost identified by 'very_hard_to_brake_password' with grant option;

Начнем.
Фазу установки виртуального окружения , распаковки архива, пожалуй , опущу. Отмечу только, что перед синхронизацией БД (syncdb) не забываем прописать настройки доступа к СУБД в settings.py. Остальные первичные телодвижения, которые надо сделать неплохо описаны здесь.
Естественно ни у кого никогда сразу все не ставится. Первое, что мне потребовалось доставить - модуль gunicorn :

#не забываем ставить пакеты при активированном вирт.окружении
easy_install gunicorn

Второе, на что ругнулся скрипт синхронизации БД - отсутствие MySQLdb. ИЗИ_инсталлами он не ставится. Качаем с surceforge последний тарболл MySQL-python-1.2.3.tar.gz , распаковываем, и ставим

wget "длинный дайрект линк с сорцфорж"
tar xvfz MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3
python ./setup.py install

Итак, база синхронизована (syncdb), магазин проиницализирован (lfs_init), тестовый сервер запущен. Открываем. И, судя по всему, видим первый "баг совместимости". В данном случае совместимости дефолтных настроек от джанги старых версий с новой джангой.

Module "django.core.context_processors" does not define a "auth" callable request processor

Исправляется просто. Открываем settings.py, ищем список TEMPLATE_CONTEXT_PROCESSORS , комментируем (если страшно)или удаляем :

TEMPLATE_CONTEXT_PROCESSORS = (
#...some processors here
    'django.contrib.auth.context_processors.auth',
#    'django.core.context_processors.auth',
#...some processors here
)

Запускаем тестовый сервер. Обновляем страницу. И, "следующий сказал заведующий". Другая ошибка:

Error importing template source loader django.template.loaders.filesystem.load_template_source: "'module' object has no attribute 'load_template_source'

Помните, я выше советовал создать проект-пустышку ? открываем его settings.py, копируем целиком оттуда список TEMPLATE_LOADERS и заменяем им аналог в settings.py нашего lfs-ного магазина.

#список шаблонозагрузчиков должен выглядеть так
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

Перезапускаем тестовый сервер или даем ему самому перезапуститься. И эврика, ничего толком не делали и уже видим готовый интернет-магазин )) Шучу, конечно, нам его еще допиливать и допиливать до "требований заказчика".
На этой мажорной ноте "часть первую", пожалуй закончу. Если у кого, вылезло, что-то еще в ходе описанных стадий, о чем я не упомянул - милости прошу поделиться)

четверг, 24 мая 2012 г.

flatpages валится в продакшене

Поразительно мрачный глюк сегодня уделал меня в flatpages!
Приложение в debug =True работает на ура. При debug = False то работает то нет! Пока понял закономерность - поседел.
Валились страницы , где рендерились flatpages. Понял , что в них дело , но как пофиксить никак не мог дотукать. Почитал матчасть и освежил особенность , связанную с обработкой 404. Простая страница будет рендериться, если не найдено ни одного подходящего урла. Да, только оказалось, что еше ей нужен фейковы 404.html в корне темплейтов. Ужас. Поди - догадайся!
Надеюсь кому-то помогло. p.s. да... еще проверьте, что у вас не переопределены хендлеры для 404, а то тоже не получится отрендерить простую страницу...

среда, 16 мая 2012 г.

django: flatpages error "Cannot use None as a query value"

Если при попытке сохранения flatpage из админки django вылезает страница с ошибкой "Cannot use None as a query value", то скорее всего вы не заполнили то или иное обязательное поле. И скорее всего - это поле site. Оно так неявно расположено и еще более неявно является обязательным, что все наступают на эти грабли.
А почему не срабатывает стандартный для админки контроль обяхательных полей - без страшных страниц со стеками? А потому что баг и в транке он уже пофикшен Ticket #18324
Просто не ожидаешь такого от контрибовских приложений для стабильной версии.
Ну ничего, бывает )

суббота, 12 мая 2012 г.

batch file encoding convertaion

If you need to change encoding of large amount of files in *nix you could find + iconv For example, you are in some site directory and wanna convert all html-files from cp1251 to utf8:

~$ find ./ -name "*.html" -exec iconv -f cp1251 -t utf8 {} -o {}.utf8 \;
~$ find ./ -name "*.html" -exec mv {}.utf8 -o {} \;
find ./ -name "*.html" -exec mv {}.utf8  {} \;

Good luck.

PHP: is_a(): Deprecated. Please use the instanceof operator

Попался тут один сайтик написанный на древней версии php , который пылился в архиве лет 5 и теперь должен быть восстановлен. Имеется в распоряжении хостинг с поддержкой php5. Сайт запустился с пол-пинка, но я постоянно ждал , что какие-нибудь проблемы с совместимостью все-таки вылезут. Так и получилось. В одном из сценариев выполение завершилось ошибкой:
is_a(): Deprecated. Please use the instanceof operator
Полез в код и заменил проблемную строку :

#if(!is_a($_m5_controls, "Tpl"))
if(!$_m5_controls instanceof Tpl)

Вот такая вот небольшая шпаргалка )