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