
Язык 🇷🇺 Русский
Документация
Начало работы
Использование
Справочник API
Добавьте комментарии в ваше Django‑приложение
Это официальный пакет Django для FastComments.
Компоненты живых комментариев и чата с безопасным SSO через шаблонные теги.
Репозиторий
Требования 
- Python 3.10+
- Django 4.2, 5.0, 5.1, or 5.2
- Идентификатор арендатора FastComments (используйте
demo, чтобы попробовать без учётной записи) - Секрет API требуется только для Secure SSO
Установка 
Установите из тега релиза (этот проект распространяется через 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",
]
Быстрый старт 
Настройте вашего арендатора в settings.py:
import os
FASTCOMMENTS = {
"TENANT_ID": os.environ.get("FASTCOMMENTS_TENANT_ID", "demo"),
}
Поместите виджет в любой шаблон:
{% load fastcomments %}
{% fastcomments url_id="my-page" %}
Требования для автоматического SSO 
Чтобы автоматически передать вошедшего пользователя в виджет, теги читают
текущего пользователя из запроса. Убедитесь, что ваш проект содержит оба эти элемента (они
включены по умолчанию в стандартном проекте Django):
django.template.context_processors.requestinTEMPLATES["OPTIONS"]["context_processors"]django.contrib.auth.middleware.AuthenticationMiddlewareinMIDDLEWARE
Если в контексте шаблона отсутствует запрос, виджеты отображаются для анонимного
посетителя. Вы всегда можете передать пользователя явно: {% fastcomments user=some_user %}.
Теги виджета 
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.
| Tag | Widget |
|---|---|
{% 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 ключам конфигурации виджета:
| Argument | Config key | Tags |
|---|---|---|
url_id | urlId | комментарии, живой чат, бейдж количества комментариев, совместный/чат с изображениями, последние комментарии, сводка отзывов |
url | url | комментарии, живой чат, совместный/чат с изображениями |
readonly | readonly | комментарии, живой чат, совместный/чат с изображениями |
locale | locale | комментарии, живой чат, совместный/чат с изображениями, активность пользователя |
has_dark_background | hasDarkBackground | все |
default_sort_direction | defaultSortDirection | комментарии, живой чат, совместный/чат с изображениями |
number_only | numberOnly | бейдж количества комментариев |
is_live | isLive | бейдж количества комментариев |
count | count | последние комментарии, последние обсуждения |
target | (querySelector, not sent) | совместный чат, чат с изображениями |
chat_square_percentage | chatSquarePercentage | чат с изображениями |
user_id | userId | активность пользователя |
Примеры:
{% 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 (Единый вход) 
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осознанно. FastCommentsid— это постоянный идентификатор истории комментариев пользователя. По умолчанию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 на стороне сервера 
С установленным дополнительным модулем [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)
Регион ЕС 
Установите REGION, чтобы направлять виджеты и API в ЕС:
FASTCOMMENTS = {"TENANT_ID": "...", "REGION": "eu"}
Настройка встраиваемой разметки 
Переопределите fastcomments/widget.html, разместив свою собственную копию раньше в
пути поиска шаблонов (проект templates/fastcomments/widget.html). Это
аналог в Django команды Laravel vendor:publish --tag=fastcomments-views.
Справочник настроек 
| Ключ | По умолчанию | Описание |
|---|---|---|
TENANT_ID | "" | Ваш идентификатор арендатора FastComments (demo для тестирования). |
API_KEY | "" | Ваш секретный API‑ключ. Подписывает Secure SSO и аутентифицирует admin(). |
REGION | None | None для США, "eu" для региона ЕС. |
SSO.ENABLED | False | Включить SSO. |
SSO.MODE | "secure" | "secure" (HMAC) или "simple" (без подписи). |
SSO.LOGIN_URL / SSO.LOGOUT_URL | None | Отображается незарегистрированным посетителям; по умолчанию reverse("login"/"logout"). |
SSO.USER_MAP | id/email/username | Поле FastComments, указывающее атрибут/путь/вызываемую функцию пользователя. |
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDS | None | callable(user) или путь через точки. |
SSO.USER_MAPPER | None | Путь через точки к callable(user) -> dict; наивысший приоритет. |
WIDGET_DEFAULTS | {} | Конфигурация, объединяемая в каждый виджет (ключи в camelCase). |
Пример проекта 
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 для руководства по внесению вклада.