FastComments.com

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


Това е официалният Django пакет за FastComments.

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

Хранилище

Вижте в GitHub


Изисквания Internal Link


  • Python 3.10+
  • Django 4.2, 5.0, 5.1, or 5.2
  • FastComments tenant ID (използвайте demo, за да го изпробвате без акаунт)
  • API secret е необходим само за Secure SSO

Инсталиране Internal Link

Install from a release tag (this project is distributed via git tags, not PyPI):

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

For server-side REST access (the admin() / public_api() helpers), add the api extra, which pulls in the SDK's generated client:

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

Add the app to INSTALLED_APPS:

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

Бърз старт Internal Link


Configure your tenant in settings.py:

import os

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

Drop the widget into any template:

{% 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

Всеки уиджет има свой собствен таг. Всички те приемат **extra ключови аргументи, които се сливат в конфигурацията на уиджета както са (използвайте camelCase ключове) за всичко, което не е обхванато от именуваните аргументи по-долу.

ТагУиджет
{% fastcomments %}Comments
{% fastcomments_live_chat %}Live chat
{% fastcomments_comment_count %}Comment count badge
{% fastcomments_comment_count_bulk %} + {% fastcomments_count_marker %}Bulk comment counts
{% fastcomments_collab_chat target="#el" %}Collaborative (inline) chat
{% fastcomments_image_chat target="#el" %}Image annotation chat
{% fastcomments_recent_comments %}Recent comments
{% fastcomments_recent_discussions %}Recent discussions
{% fastcomments_reviews_summary %}Reviews summary
{% fastcomments_top_pages %}Most-discussed pages
{% fastcomments_user_activity user_id="..." %}A user's activity feed

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

АргументКлюч в конфигурациятаТагове
url_idurlIdcomments, live chat, comment count, collab/image chat, recent comments, reviews summary
urlurlcomments, live chat, collab/image chat
readonlyreadonlycomments, live chat, collab/image chat
localelocalecomments, live chat, collab/image chat, user activity
has_dark_backgroundhasDarkBackgroundall
default_sort_directiondefaultSortDirectioncomments, live chat, collab/image chat
number_onlynumberOnlycomment count
is_liveisLivecomment count
countcountrecent comments, recent discussions
target(querySelector, not sent)collab chat, image chat
chat_square_percentagechatSquarePercentageimage chat
user_iduserIduser activity

Примери:

{% 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 primary key за удобство без конфигурация, но последователните целочислени 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

With the [api] extra installed, call the FastComments REST API through the SDK, pre-configured with your API key and region:

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). Това е аналогът на Django за Laravel vendor:publish --tag=fastcomments-views.

Справка за настройки Internal Link

КлючПо подразбиранеОписание
TENANT_ID""Вашият FastComments tenant ID (demo за тестване).
API_KEY""Вашият API secret. Подписва 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 repository за насоки за принос.