2009-07-03

Pylons, несколько ньюансов.

Изучаю питоновский веб-фреймворк Pylons. На английском языке полно официальной документации к его компонентам, на русском же бедновато. Так как присутствует несколько самостоятельных кирпичиков, приходится изучать сразу в нескольких направлениях. Хорошо джангистам, у них один DjangoBook на все случаи жизни. А тут и paste, и mako, и sqlalchemy, и webhelpers, и вообще невпроворот всего, и у каждого своя документация. А потом надо по доке Pylons учесть ньюансы их взаимодействия. Иногда мозг вскипает, пока сообразишь как и что. Чтобы не позабыть находок, что были сделаны в процессе исследования, немного о них расскажу.

Работа с базами данных.

По умолчанию, в Ubuntu пилоны комплектуются библиотекой sqlalchemy, хотя можно использовать sqlobject или вообще не использовать ничего, кроме стандартного db-api. Я не стал ничего менять - алхимия так алхимия.
Построение модели в докуметации пилонов описано так: создаем описания таблиц, потом классы, потом привязываем одно к другому и определяем отношения между ними. Сайт SQLAlchemy предлагает вариант совмещения этого в одном определении класса. Можно и так и эдак, но вот чтобы из определения таблиц создать реальную схему в базе данных путем "paster setup-app development.ini" второй способ не самый лучший. У меня они не создавались ни в какую, только первый пилоновский метод дает ожидаемый результат. Зато если таблицы создавать вручную, мне больше понравился именно способ sqlalchemy, получается компактнее как-то, все в кучке.

Теперь дальше. Использование SQLite и MySQL проблем не вызвало. Но по работе мне потребовалось коннектить приложение с MSSQL Server 2005, а это уже куда интереснее. Не буду вдаваться в подробности, просто сразу дам совет: используйте ODBC. Модуль python-mssql время от времени падал с ошибкой, а вот pyodbc повел себя молодцом. Поэтому в файле development.ini, раздел [app:main], нужно прописать соединение с MSSQL через ODBC, используя модуль pyodbc:

sqlalchemy.url = mssql://user:password@host\instance/dbname
sqlalchemy.module_name=pyodbc

Именно так. Кто не понял, что такое instance? Это имя установленного сервера. В 2005 Express версии оно SQLEXPRESS по умолчанию. Остальное должно быть понятно.
Теперь дальше. Угадайте, в какой кодировке отдает данные этот сервер? Правильно, в cp1251. А нам надо в какой? Конечно, unicode. Там же:

sqlalchemy.encoding='cp1251'
sqlalchemy.convert_unicode = true

В документации по SQLAlchemy, в разделе API Reference есть еще несколько параметров.

Роутинг.
Тут пара ньюансов. Там, где в Ubuntu map.connect('',controller="index",action="index"), в Windows версии '' пришлось заменить на '/', загадочно это конечно, но вот у меня так. Иначе ошибка.
И там, где в Linux:
map.connect("/:controller/:action/:id")

в Windows:
map.connect("/{controller}/{action}/{id}").
Тоже какая-то тайна тут кроется...

Шаблоны Mako. Чудесная штука. Есть две вещи, о которых я должен упомянуть.
Во-первых, это отвратительная реакция редакторов и IDE на теги <%. Об этом я писал чуть раньше. Кстати, в Windows второй из описанных способов не работает, не знаю почему.
Во-вторых, мне хотелось, чтобы если в шаблоне указанная переменная отсутствует, то показывалась бы пустая строка на ее месте, а не ошибка. Вот два пути:
Этот я нашел где-то в сети, но мне кажется, он не работает как надо, в начале шаблона ставить такой блок:
<%!

UNDEFINED=''

%>
А этот более кардинальный. В файле /config/environment.py, в функции load_environment добавить:
config['pylons.strict_c'] = False


В версии 1.0 эта строка выгладит как
config['pylons.strict_tmpl_context'] = False

И ошибки нехватки переменных в шаблоне как рукой сняло.
Пока что все. У кого есть толковые советы - милости прошу.

1 комментарий:

Rush комментирует...

Посмотри elixir, он возводит sqlalchmemy на новый уровень. В качестве шаблонов мне нравится genshi, но он сложнее к пониманию чем make, зато имеер ряд весомых (для меня) преимущест (например безпроблемное отображение "неанимированного" шаблона в браузере, что позволяет без проблем вернуть его на доработку верстальщику/дизайнеру и получить обратно живым и здоровым).