Мои проекты

Аватары, имена и динамические шаблоны

Подключаем Python callbacks и отдельно разбираем контракт собственной CAPTCHA.

Урок 15 / 22 · Commentail 1.3.2

Для данных, которых нет в обычных настройках, у Commentail есть callbacks — функции вашего проекта, вызываемые библиотекой. В конфигурации указывается строка импорта, а не результат вызова функции.

Имена и аватары

Создайте myproject/comments.py, заменив myproject настоящим импортируемым пакетом сайта:

python
def get_author_name(user, request):
    """Use the account's chosen full name, then its login name."""
    return user.get_full_name().strip() or user.get_username()


def get_avatar(context, request):
    """Read the host project's optional profile avatar."""
    if context.user is None:
        return None
    profile = getattr(context.user, "profile", None)
    image = getattr(profile, "avatar", None)
    return image.url if image else None


def get_comment_templates(page, request):
    """Declare the actual dynamic include used by the host Page template."""
    return ["articles/discussion.html"]

Этот пример имени рассчитан на User с методами get_full_name() и get_username(). Аватар предполагает существующий profile.avatar; собственного профиля код не создаёт. Если поле у вас иначе называется, адаптируйте его. Не добавляйте удалённый HTTP-запрос при отрисовке каждого комментария.

python
COMMENTAIL = {
    "default": {
        "GET_AUTHOR_NAME": "myproject.comments.get_author_name",
        "GET_AVATAR": "myproject.comments.get_avatar",
        "GET_COMMENT_TEMPLATES": "myproject.comments.get_comment_templates",
    },
}

Функция имени меняет отображение зарегистрированного автора; имя гостя сохраняется таким, каким он его отправил. Avatar context содержит id, display_name, user, site и target, но не адрес гостя. Возврат None сохраняет инициалы; сбой callback даёт штатный fallback, а не разрешение скрывать исключения в своём коде.

Когда нужен GET_COMMENT_TEMPLATES

Третья функция нужна только когда Page выбирает шаблон обсуждения динамически и библиотека не может обнаружить зависимость обычным способом. Создайте реальный templates/articles/discussion.html с {% load commentail_tags %} и {% commentail page %}, а затем действительно включайте его из Page. Одна функция виджет не добавляет. Если динамики нет, удалите эту функцию и её настройку из примера.

Доступ к гостевой почте без браузера

CAN_SEND_GUEST_EMAIL(recipient, target, site) проверяет право получателя, когда обработчик не имеет его браузерной сессии. Для обычной общедоступной Wagtail Page особый callback не нужен. Для закрытой страницы нужно доказать конкретное право — например, действующую подписку по вашей модели данных. Не возвращайте безусловный True. Для обычных Django-объектов конкретный рабочий пример приведён в уроке 17.

Если нужен свой CAPTCHA backend

У класса без аргументов конструктора два метода: create(request, site) возвращает CaptchaTask из commentail.security, verify(request, site, challenge_id, answer) — bool. В задаче есть строковый id до 255 символов, имя шаблона и словарь публичных строк data. Решение и секреты остаются на сервере; шаблон отправляет поле answer.

Библиотека связывает задачу с браузером и Site, проверяет срок, попытки и одноразовость. Backend сам обслуживает дополнительное приватное состояние и его очистку. Используйте этот путь при существующем проверяемом провайдере; учебная функция «всегда True» отключила бы защиту, поэтому готового псевдобэкенда здесь нет. Точный контракт и ограничения нужны перед собственной реализацией.

Другие уроки по этой задаче

Документация по теме

Была ли статья полезна?

Комментарии 0

Имя: до 40 символов.

После отправки мы пришлём письмо со ссылкой для подтверждения email.

Не более 5000 символов.

Опубликованных комментариев пока нет.