Понадобился мне недавно 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

  1. Артём Сапегин

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

  2. Александр Кошелев

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

  3. Ivan Sagalaev

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

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

  4. Ivan Sagalaev

    Хотя, если подумать над спеком 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. Ivan Sagalaev

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

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

  7. Александр Кошелев

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

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

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

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

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