FastComments.com

Voeg reacties toe aan uw Django-app

Dit is het officiële Django‑pakket voor FastComments.

Live reacties en chatcomponenten met veilige SSO via sjabloontags.

Repository

Bekijk op GitHub

AI-coderingsagenten Internal Link

skills.sh

Geef je code‑agent de FastComments‑context die hij nodig heeft - widgets, configuratie, Secure SSO, de REST‑API en de SDK’s:

npx skills add fastcomments/skills

Werkt met Claude Code, Codex, Cursor, Copilot, Gemini en elke andere agent die de skills CLI ondersteunt.

Vereisten Internal Link

  • Python 3.10+
  • Django 4.2, 5.0, 5.1, of 5.2
  • Een FastComments tenant ID (gebruik demo om het zonder account uit te proberen)
  • Een API secret is alleen vereist voor Secure SSO

Installatie Internal Link

Installeer vanaf een release‑tag (dit project wordt gedistribueerd via git‑tags, niet via PyPI):

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

Voor server‑side REST‑toegang (de admin() / public_api() helpers), voeg de api extra toe, die de door de SDK gegenereerde client binnenhaalt:

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

Voeg de app toe aan INSTALLED_APPS:

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

Snelstart Internal Link

Configureer uw tenant in settings.py:

import os

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

Plaats de widget in een willekeurige template:

{% load fastcomments %}

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

Voorvereisten voor automatische SSO Internal Link

Om de ingelogde gebruiker automatisch aan de widget door te geven, lezen de tags de
huidige gebruiker uit het request. Zorg ervoor dat je project beide heeft (ze
staan standaard ingeschakeld in een standaard Django-project):

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

Zonder een request in de template-context renderen widgets voor een anonieme
bezoeker. Je kunt altijd expliciet een gebruiker doorgeven: {% fastcomments user=some_user %}.

Widget-tags Internal Link

Elke widget heeft zijn eigen tag. Alle widgets accepteren **extra keyword‑argumenten, die ongewijzigd worden samengevoegd in de widgetconfiguratie (gebruik camelCase‑sleutels) voor alles dat niet wordt gedekt door de hieronder genoemde argumenten.

TagWidget
{% fastcomments %}Reacties
{% fastcomments_live_chat %}Livechat
{% fastcomments_comment_count %}Reactieteller badge
{% fastcomments_comment_count_bulk %} + {% fastcomments_count_marker %}Bulk reactietellingen
{% fastcomments_collab_chat target="#el" %}Samenwerkende (inline) chat
{% fastcomments_image_chat target="#el" %}Afbeeldingsannotatie chat
{% fastcomments_recent_comments %}Recente reacties
{% fastcomments_recent_discussions %}Recente discussies
{% fastcomments_reviews_summary %}Samenvatting van recensies
{% fastcomments_top_pages %}Meest besproken pagina's
{% fastcomments_user_activity user_id="..." %}Activiteitsfeed van een gebruiker

Naamgegeven argumenten worden gemapt naar de camelCase‑configuratiesleutels van de widget:

ArgumentConfig keyTags
url_idurlIdreacties, livechat, reactieteller, samenwerkende (inline) chat/afbeeldingsannotatie chat, recente reacties, samenvatting van recensies
urlurlreacties, livechat, samenwerkende (inline) chat/afbeeldingsannotatie chat
readonlyreadonlyreacties, livechat, samenwerkende (inline) chat/afbeeldingsannotatie chat
localelocalereacties, livechat, samenwerkende (inline) chat/afbeeldingsannotatie chat, gebruikersactiviteit
has_dark_backgroundhasDarkBackgroundalle
default_sort_directiondefaultSortDirectionreacties, livechat, samenwerkende (inline) chat/afbeeldingsannotatie chat
number_onlynumberOnlyreactieteller
is_liveisLivereactieteller
countcountrecente reacties, recente discussies
target(querySelector, not sent)samenwerkende (inline) chat, afbeeldings chat
chat_square_percentagechatSquarePercentageafbeeldings chat
user_iduserIdgebruikersactiviteit

Voorbeelden:

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

{# Samenwerkende chat wordt gekoppeld aan een bestaand element op de pagina #}
<article id="post-body">...</article>
{% fastcomments_collab_chat target="#post-body" %}

{# Bulk tellers: plaats markers, daarna vult één bulkloader ze allemaal 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 (Single Sign-On) Internal Link

Schakel SSO in en kies een modus in settings.py. Secure SSO ondertekent de gebruiker server-side met HMAC-SHA256 met behulp van je API secret en wordt aanbevolen.

FASTCOMMENTS = {
    "TENANT_ID": os.environ["FASTCOMMENTS_TENANT_ID"],
    "API_KEY": os.environ["FASTCOMMENTS_API_KEY"],   # je API secret; ondertekent Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Koppel FastComments-velden aan je user model. Waarden kunnen een attribuut-
        # naam zijn, een dotted path ("profile.avatar_url"), een callable(user), of 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, of dotted path
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, of dotted path
    },
}

Kies de SSO id bewust. De FastComments id is de permanente verwijzing naar de commentaarhistorie van een gebruiker. De standaard USER_MAP koppelt deze aan je Django primary key voor zero-config gemak, maar sequentiële integer PK's zijn raadpleegbaar en moeilijk later te wijzigen (het wijzigen van de id van een gebruiker splitst hun historie in een nieuw account). Voor alles meer dan een demo, koppel id aan een stabiele, ondoorzichtige waarde die vooraf gekozen is (een UUID of een speciaal publiek id), en plaats nooit privégegevens erin. De voorbeeldapp gebruikt daarom een op gebruikersnaam gebaseerd id.

SSO wordt automatisch geïnjecteerd in {% fastcomments %}, {% fastcomments_live_chat %}, {% fastcomments_collab_chat %}, {% fastcomments_image_chat %}, en {% fastcomments_user_activity %} voor de huidige gebruiker.

Login/logout-URL's die worden getoond aan uitgelogde bezoekers verwijzen standaard naar reverse("login") / reverse("logout"); overschrijf deze met SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

Aangepaste mapping

Twee opties met hogere prioriteit gaan vóór USER_MAP:

  • Een methode op je user model (het Pythonische equivalent van een interface):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • Een globale mapper, een dotted path naar callable(user) -> dict:

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

De prioriteit is USER_MAPPER > to_fastcomments_user_data() > USER_MAP.

Server-side API-toegang Internal Link

Met de [api] extra geïnstalleerd, roep de FastComments REST API aan via de SDK, vooraf geconfigureerd met uw API‑sleutel en regio:

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)

EU-regio Internal Link

Stel REGION in om de widgets en API naar de EU te routeren:

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

Aanpassen van de embed-markup Internal Link

Overschrijf fastcomments/widget.html door uw eigen kopie eerder op het sjabloon‑zoekpad (een project templates/fastcomments/widget.html). Dit is de Django‑analog van Laravel's vendor:publish --tag=fastcomments-views.

Instellingenreferentie Internal Link

SleutelStandaardBeschrijving
TENANT_ID""Uw FastComments-tenant-ID (demo voor testen).
API_KEY""Uw API‑geheim. Ondertekent Secure SSO en authenticeert admin().
REGIONNoneNone voor US, "eu" voor de EU-regio.
SSO.ENABLEDFalseSchakel SSO in.
SSO.MODE"secure""secure" (HMAC) of "simple" (ongetekend).
SSO.LOGIN_URL / SSO.LOGOUT_URLNoneGetoond aan uitgelogde bezoekers; standaard reverse("login"/"logout").
SSO.USER_MAPid/email/usernameFastComments‑veld naar gebruikersattribuut/pad/aanroepbaar.
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDSNonecallable(user) of puntnotatie‑pad.
SSO.USER_MAPPERNonePuntnotatie‑pad naar callable(user) -> dict; hoogste prioriteit.
WIDGET_DEFAULTS{}Configuratie samengevoegd in elke widget (camelCase‑sleutels).

Voorbeeldproject Internal Link

Een uitvoerbare showcase bevindt zich in example/: een left-rail + main-stage app met een pagina per widget en een inlogpagina die vooraf ingestelde demo‑gebruikers vermeldt.
Log in als een van hen en de commentaar‑ en live‑chat‑widgets authenticeren die identiteit via Secure SSO. Van die map:

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

Zonder een API‑secret valt het terug naar de publieke demo tenant (anoniem).
example/browser_smoke.py is een Playwright‑e2e die de pagina laadt in een echte browser en een opmerking plaatst als de Secure‑SSO gebruiker.

Hulp nodig?

Als je problemen ondervindt of vragen hebt over het Django-pakket, kun je:

Bijdragen

Bijdragen zijn welkom! Bezoek de GitHub-repository voor richtlijnen voor bijdragen.