Понадобился мне недавно pingback-сервер, и я, посмотрев на django-pingback, в приступе NIH-синдрома написал своё приложение — pingdjack. За название спасибо Михаилу Лукьянченко.

Отмазка

Более-менее реальные претензии к django-pingback у меня тоже есть. Хотя я сразу признаюсь, что не пробовал во что бы то ни стало с ней ужиться, просто код почитал. Претензии такие:

Pingdjack

Получилась библиотечка из двух модулей: клиента и сервера. Единственная внешняя зависимость — html5lib, без неё нынче никуда :-).

Клиента я просто выдрал из Cicero. Он состоит из трёх функций:

Когда их вызывать — дело того приложения, которое делает пинги.

Серверная часть написана с нуля.

Там есть вьюха server_view, которая подключается в любое место urlconf'а, какое вам хочется. Она парсит XML-RPC-запрос и вызывает всякие проверки и парсинг HTML'а источника. В частности:

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

def handle_pingback(sender, source_url, view, args, author, excerpt, **kwargs):
    if view != post:
        return # интересны только пинги на посты
    post = Post.objects.get(slug=args[0])
    post.comment_set.create(
        text = excerpt,
        url = source_url,
        author = author,
    )
pingdjack.received.connect(handle_pingback)

Пользуйтесть на здоровье!

P.S. Кстати, библиотечка вышла на каких-то 158 строк питоньего кода.

Комментарии: 7 (feed)

  1. Круто, спасибо!

  2. Ещё на стороне сервера надо не забывать проверять был ли с такого-то урла уже ping;-) Хотя при такой системе с сигналами, если он и был уже, то об том факте нельзя будет указать клиенту.

  3. Интересно, что теоретически защиту от дублей можно делать и на стороне клиента, и на стороне сервера. Хотя, если подумать над спеком pingback'а, то тот факт, что он не запрещает явно многократное пингование, говорит о том, что скорее серверу надо запоминать, какие пинги он уже принимал. Клиенту про это знать и не надо: пусть пингует.

    Я всё раздумываю, включить ли этот код в саму библиотеку или оставить это на совесть того кода, который ею пользуется. От включения в библиотеку держит то, что тогда она сразу получает файл models.py, должна быть включена в INSTALLED_APPS и от этого начинает выглядеть более сложной.

  4. Хотя, если подумать над спеком pingback'а

    Я таки пошёл почитать. И нашёл вот это:

    Faults

    If an error condition occurs, then the appropriate fault code from the following list should be used.

    [...]

    0×0030 (48)

    The pingback has already been registered.

    То есть это, без вариантов, дело сервера, и у него даже есть способ ответить про это клиенту. Хотя и опционально. Придётся дописывать :-)

  5. Я про этот статус ответа и говорю. Но по большому счету от бесполезен (как и большинство остальных).

    Если клиент не сохраняет информацию об уже отпингованных урлах, то у него от прихода такого статуса ничего не изменится. А если колиент как-то у себя хранит уже обработанные урлы, то он не будет и так пинговать их повторно.

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

  6. Поэтому мне кажется, что раз нет легкого пути из обработчика сигнала вернуть некий статус этой обработки

    Почему нет? Результаты из обработчиков сигнала вполне возвращаются. Но я не хочу вообще грузить этой заботой обработчик сигнала. Ведь все остальные ошибочные ситуации pingdjack отлавливает и вроде бы предоставляет своему пользователю хороший сервис: "я позову сигнал, когда уже точно всё нормально". Но вот дубли — не отлавливает. Нехорошо.

  7. Почему нет? Результаты из обработчиков сигнала вполне возвращаются.

    Я как-то об этом забыл. Тогда вообще проблемы нет.

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

    Тут меня смущает то, что информация об пинге будет храниться в нескольких местах (минимум в двух: пингджеке и комментариях), что при слабой их связности может породить какие-нибудь плохие эффекты. Хотя это конечно уже совсем придирка.

Добавить комментарий

Текст через пустую строку превращается в отдельные абзацы, цитата отделяется символами > слева, список состоит из пунктов с дефисом слева, курсив выделяется * с каждой стороны, жирный - двойными **, блоки кода отступают слева на 4 пробела