Иван Сагалаев

21.01.10 02:37

Django

Понадобился мне недавно 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 строк питоньего кода.

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

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

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

  2. bialix

    Иван, поправь название проекта на LP:

    Pingback server and client implementaion for Django

    implementation

  3. Иван Сагалаев

    Спасибо, поправил.

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

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

  5. Иван Сагалаев

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

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

  6. Иван Сагалаев

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

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

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

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

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

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

  8. Иван Сагалаев

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

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

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

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

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

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

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

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

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