пятница, 15 мая 2009 г.

Ну зачем так?

Самое загадочное в Python, на мой взгляд - ';'.join(words)
Неужто есть рациональное объяснение этому?

среда, 13 мая 2009 г.

Суп с приключениями

Понадобилось тут вырезать адрес RSS-ленты со страничек. Ну, думаю, возьму BeautifulSoup и делов-то. Для ЖЖ всё прошло без проблем:
>>> import urllib
>>> html = urllib.urlopen('http://kurilka.livejournal.com/').read()
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(html)
>>> soup.findAll('link', {'type':'application/rss+xml'})[0]['href']
u'http://kurilka.livejournal.com/data/rss'

Ну, думаю, гораздо более демонстративно будет, если я вытяну RSS прямо для этого же блога, куда пишу сейчас этот пост. Но не тут-то было...
Упало оно с криком HTMLParser.HTMLParseError: bad end tag: u"</scr'+'ipt>". Причём, оказывается, что это программеры Google попирают спецификации W3C и не экранируют "</" в тексте скрипта. Поэтому пришлось пока сделать временную "затычку":

>>> import urllib
>>> html = urllib.urlopen('http://django-newbie.blogspot.com/').read()
>>> html = html.replace("</src'", '')
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(html)
>>> soup.findAll('link', {'type':'application/rss+xml'})[0]['href']
u'http://django-newbie.blogspot.com/feeds/posts/default?alt=rss'

Вот так и воюем: то с нестрогими спецификациями, то с нестрогим их соблюдением...
P.S. И ещё больше добила борьба с blogger.com, жестоко коверкающим тэги

понедельник, 4 мая 2009 г.

Продолжая тему открытости

Simon Willison выложил в публичный доступ репозиторий с исходным кодом djangopeople.net, думаю полезно в качестве хорошего примера по Django

воскресенье, 3 мая 2009 г.

Касты из Ченнаи

В рамках пассивного обучения Django посмотрел тут касты одного индуса под названи Learn Django: Create a Wiki in 20 minutes. В целом довольно познавательные ролики, только вот как-то оно неаккуратно. В первых 2 частях код правится в VIM, а в третьей - в WingIDE. И оформление кода несколько стремновато. Ещё это усугубляет, что сделано оно на версии 0.96, а в версия 1.0 привнесла среди прочего пару актуальных изменений:
  • Текст выводимый в шаблонах "автоискейпится" и можно безопасно выводить любые переменные в результирующий html, т.е. не надо каждый раз добавлять фильтр escape для переменных, а наоборот лишь в случае необходимости добавлять фильтр safe (или тэг autoescape);
  • В urlconf'ах появились имена паттернов, и тэг url может принимать эти самые имена, но судя по документации тэг этот был и ранее, так что "прибивание гвоздями" адресов нельзя оправдать (показательно, как он сам потом ручками во всех шаблонах меняет адреса на новый формат).
Думаю, автору бы не помешало посмотреть презентацию о reusable apps, про которую я писал. Но в целом (если откинуть шероховатости) довольно неплохой пример для новичков.

суббота, 2 мая 2009 г.

Рисуем диаграмки наших моделей

Наткнулся тут на ещё одну полезную вещь - Django Command Extensions, подборку разных полезных вспомогательных штуковин - запуск скрипта в контексте Django, управление job'ами, экспорт адресов электронной почты и др.
Но самой прикольной мне показалась комманда graph_models - которая строит граф зависимостей между моделями в приложении (по сути ER-диаграмму) при помощи GraphViz.
К примеру вот диаграммка для приложения из кастов Эрика Флоренцано, о которых я писал :




Пример, правда, не очень наглядный, т.к. моделей не из состава Django там всего 3 штуки, но при увеличении сложности приложения такая диаграммка по-моему довольно полезна для понимания структуры данных, с которым работает приложение. Надо будет поставить себе заметку построить схемку для приложения побольше.