вторник, 24 июля 2012 г.

django: ошибка при отправке e-mail

Если у Вас не отправляются письма из вашего django-проекта и при этом в debug-режиме показывается сообщения типа

'utf8' codec can't decode byte 0xcf in position 32: invalid continuation byte

то скорее всего вы пользуетесь виндой и имя вашего компьютера содержит кириллические символы.

Переименуйте комп , перезагрузите его и пробуйте отправить сообщенеи еще раз )

Удачи.

пятница, 8 июня 2012 г.

django-lfs: опыт использования. часть 3 (ошибка при работе скидками)

Этот пост небольшой и посвящен одной единственной проблемке.

django 1.4
python 2.7

В интерфейсе управления (manage) создаем объект - скидку (discount).

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

Открываем js-консоль и видим там 500 Internal server error в ответ на запрос, который делается при нажатии на "добавить критерий".

Копируем проблемный url и открываем его в отдельной вкладке (убедитесь, что settings.DEBUG=True) , чтобы увидеть стек и понять в чем причина 500-ки.


На картинке не видно, но  в стеке нас отправляют исправлять lfs/manage/criteria/views.py:49

Смотрим,  а там действительно бага - указан некорректный формат для функции strftime.
Вместо %s надо указывать %S.

#       "id": "%s%s" % (now.strftime("%s"), now.microsecond),
         "id": "%s%s" % (now.strftime("%S"), now.microsecond),

После такого простейшего фикса все должно быть ок и на форме добавления критериев скидок появляются нужные контролы.

вторник, 5 июня 2012 г.

django-lfs: опыт использования. часть 2 (темы)

Итак, нам удалось запустить тестовый сервер тестового проекта. Понятно, что стандартный внешний вид нас не устроит.
Что можно сделать, чтобы его изменить?
Надо воспользоваться так называемым механизмом "схем". Схема - это обычное django приложение , которое надо создать самому, создать в нем структуру шаблонов, аналогичную структуре шаблонов стандартной lfs-схемы (см. приложение django-lfstheme)

cd /path/to/lfs_project
python manage.py startapp custom_lfstheme
cp -r /path/to/lfstheme/application/templates ./custom_lfstheme

далее в settings.py надо добавить зависимость от этого приложения (INSTALLED_APPS), поместив его ДО 'lfstheme':

INSTALLED_APPS = (
#...
    "custom_lfstheme",
    "lfstheme",
#...
)

Вот в общем-то вся подготовка к кастомизации внешнего вида. Далее надо просто видоизменять (переписывать с нуля) скопированные шаблоны.

Ну и для того, чтобы пополнить список "несовместимостей" с django 1.4: Может вылезти и обязательно вылезет следующая ошибка (при использовании) admin интерфейса lfs:
You cannot add messages without installing 
django.contrib.messages.middleware.MessageMiddleware
Лечится просто - добавляем нужные миддлваре в settings.py проекта:

MIDDLEWARE_CLASSES = (
#...
    'django.contrib.messages.middleware.MessageMiddleware',
#...
)

среда, 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)

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

пятница, 20 апреля 2012 г.

KIckstart, виджеты vkontakte - и пара седых волос

Сегодня попросили запилить виджет ВКонтакте для отображения ифрейма одной из ВК-групп.
Ранее это я делал сотни раз - ну примитивнейшая задачка, которая сводится лишь к небольшому копипасту. Подключил нужный openapi.js от ВКонтакте.
Поместил нужный код (div+script) в нужное место нужного сайдбара и обновил страницу. Увидел два идентичных блока с данными группы. "Ха, ерунда" , подумал я , будучи уверен, что скопировал лишний div или что-то вроде того...
 Увидился, когда код оказался в порядке. И началось... Ну сплошная мистика - откуда второй блок - неясно.
 Забегая вперед - на пальцах и сейчас не объясню , откуда...  Но в итоге нашел "виновника"...
На данном сайте используется CSS - фреймворк Kickstart. Довольно практичная и удобная штука, надо сказать. Ну так вот. Этот фреймфорк идет вместе со своим js-тулкитом, в котором заплен функционал для простеньких слайдшоу, некоторая хитрая работа с DOM и т.д. Файл подключен в <head>. В консоль ошибками не плюется. Сам фреймворк отлажен и пользуется популярностью у существенного количества людей. Но вот ВКонтактовский виджет зачем-то клонирует) В итоге пришлось <script> , рисующий вконтактовский ифрейм помещать непосредственно перед </body> , чтобы не дать никому шанса все испортить...
Виджетов теперь ровно столько, сколько надо - один :)

p.s. какой именно код kickstart.js все испохабил я пока не понял.. будет время (а это врядли ) - раскопаю :)