FastComments.com

Добавьте комментарии в ваше Django‑приложение


Это официальный пакет Django для FastComments.

Компоненты живых комментариев и чата с безопасным SSO через шаблонные теги.

Репозиторий

Посмотреть на GitHub


Требования Internal Link


  • Python 3.10+
  • Django 4.2, 5.0, 5.1, or 5.2
  • Идентификатор арендатора FastComments (используйте demo, чтобы попробовать без учётной записи)
  • Секрет API требуется только для Secure SSO

Установка Internal Link

Установите из тега релиза (этот проект распространяется через git‑теги, а не через PyPI):

pip install "git+https://github.com/fastcomments/fastcomments-django.git@v0.1.0"

Для доступа к REST‑интерфейсу на сервере (вспомогательные функции admin() / public_api()), добавьте api‑дополнение, которое подтягивает сгенерированный клиент SDK:

pip install "fastcomments-django[api] @ git+https://github.com/fastcomments/fastcomments-django.git@v0.1.0"

Добавьте приложение в INSTALLED_APPS:

INSTALLED_APPS = [
    # ...
    "fastcomments_django",
]

Быстрый старт Internal Link


Настройте вашего арендатора в settings.py:

import os

FASTCOMMENTS = {
    "TENANT_ID": os.environ.get("FASTCOMMENTS_TENANT_ID", "demo"),
}

Поместите виджет в любой шаблон:

{% load fastcomments %}

{% fastcomments url_id="my-page" %}

Требования для автоматического SSO Internal Link


Чтобы автоматически передать вошедшего пользователя в виджет, теги читают
текущего пользователя из запроса. Убедитесь, что ваш проект содержит оба эти элемента (они
включены по умолчанию в стандартном проекте Django):

  • django.template.context_processors.request in TEMPLATES["OPTIONS"]["context_processors"]
  • django.contrib.auth.middleware.AuthenticationMiddleware in MIDDLEWARE

Если в контексте шаблона отсутствует запрос, виджеты отображаются для анонимного
посетителя. Вы всегда можете передать пользователя явно: {% fastcomments user=some_user %}.

Теги виджета Internal Link

Every widget has its own tag. All of them accept **extra keyword arguments, which are merged into the widget config as-is (use camelCase keys) for anything not covered by the named arguments below.

TagWidget
{% fastcomments %}Комментарии
{% fastcomments_live_chat %}Живой чат
{% fastcomments_comment_count %}Бейдж количества комментариев
{% fastcomments_comment_count_bulk %} + {% fastcomments_count_marker %}Суммарные подсчёты комментариев
{% fastcomments_collab_chat target="#el" %}Совместный (встроенный) чат
{% fastcomments_image_chat target="#el" %}Чат с аннотацией изображений
{% fastcomments_recent_comments %}Последние комментарии
{% fastcomments_recent_discussions %}Последние обсуждения
{% fastcomments_reviews_summary %}Сводка отзывов
{% fastcomments_top_pages %}Самые обсуждаемые страницы
{% fastcomments_user_activity user_id="..." %}Лента активности пользователя

Именованные аргументы соответствуют camelCase ключам конфигурации виджета:

ArgumentConfig keyTags
url_idurlIdкомментарии, живой чат, бейдж количества комментариев, совместный/чат с изображениями, последние комментарии, сводка отзывов
urlurlкомментарии, живой чат, совместный/чат с изображениями
readonlyreadonlyкомментарии, живой чат, совместный/чат с изображениями
localelocaleкомментарии, живой чат, совместный/чат с изображениями, активность пользователя
has_dark_backgroundhasDarkBackgroundвсе
default_sort_directiondefaultSortDirectionкомментарии, живой чат, совместный/чат с изображениями
number_onlynumberOnlyбейдж количества комментариев
is_liveisLiveбейдж количества комментариев
countcountпоследние комментарии, последние обсуждения
target(querySelector, not sent)совместный чат, чат с изображениями
chat_square_percentagechatSquarePercentageчат с изображениями
user_iduserIdактивность пользователя

Примеры:

{% load fastcomments %}

{% fastcomments url_id="my-page" locale="en_us" default_sort_direction="MR" %}

{% fastcomments_live_chat url_id="room-1" %}

Комментарии: {% fastcomments_comment_count url_id="my-page" number_only=True %}

{# Совместный чат привязывается к существующему элементу на странице #}
<article id="post-body">...</article>
{% fastcomments_collab_chat target="#post-body" %}

{# Суммарные подсчёты: разместите маркеры, затем один bulk loader заполнит их все #}
{% for post in posts %}
    <a href="\{{ post.url }}">\{{ post.title }}</a>
    {% fastcomments_count_marker url_id=post.url_id %}
{% endfor %}
{% fastcomments_comment_count_bulk %}

SSO (Единый вход) Internal Link

Enable SSO and choose a mode in settings.py. Secure SSO signs the user server-side with HMAC-SHA256 using your API secret and is recommended.

FASTCOMMENTS = {
    "TENANT_ID": os.environ["FASTCOMMENTS_TENANT_ID"],
    "API_KEY": os.environ["FASTCOMMENTS_API_KEY"],   # your API secret; signs Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Map FastComments fields to your user model. Values may be an attribute
        # name, a dotted path ("profile.avatar_url"), a callable(user), or None.
        "USER_MAP": {
            "id": "id",
            "email": "email",
            "username": "username",
            "avatar": None,
            "display_name": None,
            "website_url": None,
        },
        "IS_ADMIN": lambda user: user.is_staff,      # callable(user) -> bool, or dotted path
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, or dotted path
    },
}

Выбирайте SSO id осознанно. FastComments id — это постоянный идентификатор истории комментариев пользователя. По умолчанию USER_MAP сопоставляет его с вашей первичным ключом Django для удобства без настройки, но последовательные целочисленные PK легко перечислить и сложно изменить позже (изменение id пользователя разбивает их историю на новую учётную запись). Для любого использования, выходящего за рамки демонстрации, сопоставляйте id со стабильным, непрозрачным значением, выбранным заранее (UUID или отдельный публичный id), и никогда не помещайте в него закрытые данные. Пример приложения использует идентификатор на основе имени пользователя по этой причине.

SSO is injected automatically into {% fastcomments %}, {% fastcomments_live_chat %}, {% fastcomments_collab_chat %}, {% fastcomments_image_chat %} and {% fastcomments_user_activity %} for the current user.

Login/logout URLs shown to signed-out visitors default to reverse("login") / reverse("logout"); override them with SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

Пользовательское сопоставление

Two higher-precedence options beat USER_MAP:

  • Метод в вашей модели пользователя (питонический аналог интерфейса):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • Глобальный маппер, точечный путь к callable(user) -> dict:

    FASTCOMMENTS = {"SSO": {"USER_MAPPER": "myapp.sso.map_user"}}

Precedence is USER_MAPPER > to_fastcomments_user_data() > USER_MAP.

Доступ к API на стороне сервера Internal Link

С установленным дополнительным модулем [api] вызовите FastComments REST API через SDK, предварительно настроенный с вашим ключом API и регионом:

from fastcomments_django import admin, public_api, get_manager

admin().get_comments("YOUR_TENANT_ID", ...)     # authenticated (DefaultApi)
public_api().get_comments_public(...)            # public (PublicApi)

# Generate an SSO token for API calls or client hand-off:
token = get_manager().sso().token_for(request.user)

Регион ЕС Internal Link


Установите REGION, чтобы направлять виджеты и API в ЕС:

FASTCOMMENTS = {"TENANT_ID": "...", "REGION": "eu"}

Настройка встраиваемой разметки Internal Link


Переопределите fastcomments/widget.html, разместив свою собственную копию раньше в
пути поиска шаблонов (проект templates/fastcomments/widget.html). Это
аналог в Django команды Laravel vendor:publish --tag=fastcomments-views.

Справочник настроек Internal Link

КлючПо умолчаниюОписание
TENANT_ID""Ваш идентификатор арендатора FastComments (demo для тестирования).
API_KEY""Ваш секретный API‑ключ. Подписывает Secure SSO и аутентифицирует admin().
REGIONNoneNone для США, "eu" для региона ЕС.
SSO.ENABLEDFalseВключить SSO.
SSO.MODE"secure""secure" (HMAC) или "simple" (без подписи).
SSO.LOGIN_URL / SSO.LOGOUT_URLNoneОтображается незарегистрированным посетителям; по умолчанию reverse("login"/"logout").
SSO.USER_MAPid/email/usernameПоле FastComments, указывающее атрибут/путь/вызываемую функцию пользователя.
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDSNonecallable(user) или путь через точки.
SSO.USER_MAPPERNoneПуть через точки к callable(user) -> dict; наивысший приоритет.
WIDGET_DEFAULTS{}Конфигурация, объединяемая в каждый виджет (ключи в camelCase).

Пример проекта Internal Link

A runnable showcase lives in example/: a left-rail + main-stage app with a page per widget and a sign-in page listing pre-seeded demo users. Sign in as any of them and the comment and live-chat widgets authenticate that identity via Secure SSO. From that directory:

python manage.py migrate
# Use your own tenant to see Secure SSO in action (an API secret enables it):
FASTCOMMENTS_TENANT_ID=... FASTCOMMENTS_API_KEY=... python manage.py runserver

Without an API secret it falls back to the public demo tenant (anonymous). example/browser_smoke.py is a Playwright e2e that loads the page in a real browser and posts a comment as the Secure-SSO user.

Нужна помощь?

Если вы столкнётесь с проблемами или у вас есть вопросы по пакету Django, пожалуйста:

Вклад

Приём вкладов приветствуется! Пожалуйста, посетите репозиторий на GitHub для руководства по внесению вклада.