как добавить pubsubhubbub в блог на django

наверное, вначале стоит пояснить, что такое PubSubHubbub. Эта технология была придумана недавно как замена веб-пингам, позволяющим оповестить всех заинтересованных, что у вас в блоге появилась новая запись. Для этого при добавлении записи нужно было отправить http-запрос на один или несколько специализированных серверов, которые дальше сами рассылали уведомления всем подписавшимся. PubSubHubbub развивает эту идею дальше, добавляя в этот запрос само содержимое поста, так что заинтересованные сайты не ломятся все сразу в ваш блог, чтобы скачать фид и вынуть из него новый текст. Однако для большего нашего удобства работает и старый механизм: достаточно «пингануть» подходящий сервер, и он сам скачает фид, извлечёт из него пост, и разошлёт его подписчикам

кратко процесс можно описать так:

  1. вы добавляете запись
  2. ваш блог отправляет серверу сообщение «в таком-то фиде новое содержимое»
  3. сервер скачивает фид и находит в нём новый пост
  4. сервер отправляет всем подписанным на обновления этого фида новый пост

итак, что нужно сделать для подключения вашего блога на django к этой радости? Во-первых, выбрать PubSubHubbub-сервер. Я сам пока знаю только один: http://pubsubhubbub.appspot.com/. Пропишем его в настройках (settings.py):

PUSH_URL = u'http://pubsubhubbub.appspot.com/'

затем нужно скачать и установить питоновский модуль для публикации в PuSH. Установка после распаковки делается обычным sudo python setup.py install

после этого нужно в методе сохранения записи (тут я не могу давать конкретику, потому что не знаю внутренностей вашего блога) добавить собственно отправку оповещения:

from pubsubhubbub_publish import publish
publish(settings.PUSH_URL, u'http://your.blog/feed.url')

но это самый простой вариант, мне хочется оповещать ещё и об обновлениях в фидах тегов:

from pubsubhubbub_publish import publish
from django.core.urlresolvers import reverse as reverse
params = [settings.PUSH_URL, u'http://your.blog/feed.url']
params.extend(map(lambda tag: 'http://your.blog%s' % (reverse('tag_feed', args=[tag])), tags))
publish(*params)

теперь остался последний шаг: нужно добавить в сам фид информацию о том, за ним можно следить при помощи PuSH. Вообще-то это должно делаться очень просто — добавлением в него вот такой строчки:

<link href="http://pubsubhubbub.appspot.com/" rel="hub" />

но в django для фидов используется навороченный Syndication Framework, поэтому придётся унаследоваться от стандартного класса отрисовки фида Atom1Feed и добавить строчку вот таким образом:

class PubSubHubbubEnabledFeed(Atom1Feed):
    def add_root_elements(self, handler):
        super(PubSubHubbubEnabledFeed, self).add_root_elements(handler)
        handler.addQuickElement(u'link', attrs={u'rel': u'hub', u'href': settings.PUSH_URL})

после этого в определениях классов фидов нужно заменить feed_type = Atom1Feed на feed_type = PubSubHubbubEnabledFeed

всё, добавление PuSH завершено! Пройдёт некоторое время, пока заинтересованные сайты узнают, что ваши фиды транслируют обновления таким способом, и после этого новые записи будут появляться на них практически моментально

ну а если вам хочется свести код минимуму, то наверное link можно прописать в фиде вручную, и вместо вызова метода publish просто отправлять на сервер запрос с параметрами hub.mode=publish&hub.url=yourfeedurls

кстати, вот обсуждение, которое сподвигло меня на доработку блога и этот пост

Артемий Трегубенко,
,

comments powered by Disqus