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

To pass the logged-in user to the widget automatically, the tags read the current user from the request. Make sure your project has both of these (they are on by default in a standard Django project):

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

Without a request in the template context, widgets render for an anonymous visitor. You can always pass a user explicitly: {% fastcomments user=some_user %}.

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

Кожен віджет має свій тег. Усі вони приймають аргументи **extra, які без змін (через camelCase) додаються до конфігурації віджета для всього, що не охоплено іменованими аргументами нижче.

ТегВіджет
{% 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‑ключам конфігурації віджета:

АргументКлюч конфігураціїТеги
url_idurlIdкоментарі, живий чат, підрахунок коментарів, спільний/зображення чат, останні коментарі, підсумок відгуків
urlurlкоментарі, живий чат, спільний/зображення чат
readonlyreadonlyкоментарі, живий чат, спільний/зображення чат
localelocaleкоментарі, живий чат, спільний/зображення чат, активність користувача
has_dark_backgroundhasDarkBackgroundвсі
default_sort_directiondefaultSortDirectionкоментарі, живий чат, спільний/зображення чат
number_onlynumberOnlyпідрахунок коментарів
is_liveisLiveпідрахунок коментарів
countcountостанні коментарі, останні дискусії
target(querySelector, не передається)спільний чат, чат з анотацією зображень
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" %}

Comments: {% fastcomments_comment_count url_id="my-page" number_only=True %}

{# Collab chat attaches to an existing element on the page #}
<article id="post-body">...</article>
{% fastcomments_collab_chat target="#post-body" %}

{# Bulk counts: place markers, then one bulk loader fills them all in #}
{% 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"],   # ваш секрет API; подписывает Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Прив'язка полів FastComments до вашої моделі користувача. Значення можуть бути атрибутом
        # назвою, шляхом з крапками ("profile.avatar_url"), callable(user) або 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, або шлях з крапками
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, або шлях з крапками
    },
}

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

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:

  • A method on your user model (the Pythonic analog of an interface):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • A global mapper, a dotted path to 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] вызовите REST API FastComments через SDK,
предварительно настроенный с вашим API‑ключом и регионом:

from fastcomments_django import admin, public_api, get_manager

admin().get_comments("YOUR_TENANT_ID", ...)     # аутентифицированный (DefaultApi)
public_api().get_comments_public(...)            # публичный (PublicApi)

# Сгенерировать SSO токен для API вызовов или передачи клиенту:
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). Это аналог Laravel vendor:publish --tag=fastcomments-views для Django.

Справочник настроек 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 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‑репозиторий для руководства по внесению вклада.