Архив за [undefined]

Мои итоги года

Если вы часто читали различные блоги в последнее время, то наверно заметили, что авторы подводят свои итоги года. Кто что сумел, не сумел в уходящем году. Описывают свои успехи и боязливо смотрят в следующий год, как бы, давая себе установку на новые свершения. Вот и я решил не отставать и тоже подвести некоторые свои личные итоги.

На самом деле уходящий год стал для меня знаковым. По сути дела, год назад я и не думал, что настолько глубоко уйду в веб разработку. Предыдущий мой опыт работы и интересы были совсем в другой области. Какое-то время это был геймдев, потом бизнес приложения. И вот совершился кардинальный переворот в сторону веба. Но не могу сказать что он случился прям в одночасье. Моё первое знакомство с веб разработкой связано конечно же с php. И первый мой проект был интернет магазин. Ага, вот так вот круто сразу. Но php меня не цепанул. Единственное, что мне в нем приглянулось это похожесть синтаксиса на С++. Кстати С++ до сих пор борется за звание фаворита в моем сердце против питона.

Знакомство же с питоном у меня произошло за долго до веб разработки и php. Первый питон-опыт я получил разбираясь с такой штукой как Scons. Это система билда типа ...

M2M отношение и post_save сигнал

Уже давно известно о небольшой(?) проблеме, связанной с post_save сигналом и ManyToMany отношением моделей. Для примера, Лориен столкнулся некоторое время назад с ней, о чем есть интересный тред на форуме.

Я же всё как-то раньше мимо проходил этой особенности, но тут столкнулся лицом к лицу. Кратко расскажу предысторию.

В процессе уменьшения TODO листа по улучшению блога, встала задача организации оповещения по почте о новых комментариях. Но делать реализацию жестко завязанную на блоге не хотелось, поскольку задача оповещения в принципе может встать в любом приложении. Поэтому некоторое время я пытался разработать, до некоторой степени, универсальную систему оповещений, легко интегрируемую в любое приложение. Одной из особенностей этой системы была завязка на джанго сигналах. Уж больно направилась такая связь: произошло некоторые событие -> образовался сигнал -> пошло оповещение нужным пользователям.

И когда черновой вариант системы был реализован, я сразу решил бросить ей в бой. Первый вариант не сработал. Повесить оповещение на post_save сигнал у модели Comment не получилось. Точнее получилось конечно, но не был достигнут нужный результат. Модели связаны схематично вот так:

class Comment( models.Model ):
    #...

class Post( models.Model ):
    comments = models.ManyToManyField( Comment )
    #...

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

FeedBurner статистика через API

Некоторое время назад фиды постов и комментариев на блоге были переведены в feedburner. Надеюсь не надо говорить что это и зачем:) Для подписчиков это незаметно благодаря умному редиректу.

Одной из основных особенностей fb является подробная статистика по использованию фида. Из всех предоставляемых величин мне наиболее интересна одна - число уникальных подписчиков на фид. Это число всегда можно посмотреть на личной странице в fb или установить специальный виджет на сайт который любезно будет число подписчиков демонстрировать. Но так не интересно:)

Поскольку fb уже давно был куплен google'ом, то по хорошей их традиции имеет API для сторонних приложений. Через это API можно легко(почтив в REST стиле) получить нужную информация, в данном случае о фиде.

Среди прочих параметров меня интересует, как я уже говорил, число подписчиков. Ну что же, его и будем доставать. Беглый взгляд на документацию и не менее беглая реализация шаблонного тега, который по заданному юрлу фида достает число подписчиков:

@register.simple_tag
def feedburner_count( feed ):
    from urllib2 import urlopen
    from xml.dom import minidom
    try:
        stats = urlopen( "http://api.feedburner.com/awareness/1.0/GetFeedData?uri=%s" % feed )

        doc = minidom.parse( stats )
        entry = doc.getElementsByTagName( "entry" )[0]
        return entry.getAttribute( "circulation" )
    except:
        if settings.DEBUG:
            raise
        return ""

Всё просто. Даже ...

Подборка ссылок о django и новое на блоге

В рамках нового раздела, набралось некоторое количество ссылок связанных с джанго.

Не забудьте пролистать, может найдете что-то полезное для себя. Вы можете предложить ещё. Подключайтесь!:)

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

Ещё теперь вы можете ссылку на любой пост добавить в одну или несколько соц.сетей закладок(внизу каждого поста есть кнопочки). Если в списке нет вашей любимой сети, то пишите - добавлю:) Я лично пользуюсь del.icio.us т.к. у них есть очень хороший плагин для лисы.

Я наверно надоел уже постами про блог, просто не могу не делиться радостью из-за того, что с каждым днем огромный список todo по блогу уменьшается:)

xmlrpc - путь django

Недавно встал вопрос о реализации пингбека для блога. Как известно серверная часть этого протокола организуется через xml-rpc. И тут всё отлично, в стандартную поставку питона входит простой xml-rpc сервер, которого с головой хватает для организации standalone сервера. Но зачем ещё один сервер если у нас есть django?! Да и потом, не охота мучиться с интеграцией одного с другим. Поэтому идея простая: запросно/ответную часть отдать на откуп джанги, от нас же требуется только корректное следование протоколу по части xml.

Как это обычно бывает, что "всё уже украдено до нас". Есть реализация встраемого в джанго xml-rpc сервера. Не плохая, очень простая, потому что xml'ная часть там реализуется через тот же стандартный SimpleXMLRPCServer, т.к. там в недрах есть всё необходимое, главное знать как использовать (люблю OpenSource:)). В реализации от Пираньи пингбека тоже используется похожий метод, но чуть-чуть более гибкий.

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

Итак, первое чтобы решено сделать, это дать возможность достаточно просто делать гейты для запросов где угодно, т.е. чтобы разные приложения могли иметь свои xml-rpc "серверы" под свои нужды.

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