FastComments.com

Aggiungi commenti alla tua app Django

Questo è il pacchetto Django ufficiale per FastComments.

Componenti per commenti live e chat con SSO sicuro tramite tag del template.

Repository

Visualizza su GitHub


Requisiti Internal Link


  • Python 3.10+
  • Django 4.2, 5.0, 5.1, o 5.2
  • Un ID tenant FastComments (usa demo per provarlo senza un account)
  • Un segreto API è richiesto solo per Secure SSO

Installazione 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",
]

Guida rapida Internal Link

Configura il tuo tenant in settings.py:

import os

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

Inserisci il widget in qualsiasi template:

{% load fastcomments %}

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

Prerequisiti per SSO automatico Internal Link


Per passare l'utente autenticato al widget automaticamente, i tag leggono l'utente corrente dalla request. Assicurati che il tuo progetto abbia entrambi (sono attivi per impostazione predefinita in un progetto Django standard):

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

Senza una request nel contesto del template, i widget vengono renderizzati per un visitatore anonimo. Puoi sempre passare un utente esplicitamente: {% fastcomments user=some_user %}.

Tag del widget Internal Link

Ogni widget ha il proprio tag. Tutti accettano argomenti chiave **extra, che vengono fusi nella configurazione del widget così com'è (usa chiavi camelCase) per tutto ciò che non è coperto dagli argomenti nominati di seguito.

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

Gli argomenti nominati corrispondono alle chiavi di configurazione camelCase del widget:

ArgumentConfig keyTags
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

Esempi:

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

{# La chat collaborativa si collega a un elemento esistente nella pagina #}
<article id="post-body">...</article>
{% fastcomments_collab_chat target="#post-body" %}

{# Conteggi in blocco: posiziona i marker, poi un loader bulk li riempie tutti #}
{% 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 (Accesso Singolo) Internal Link

Enable SSO e scegli una modalità in settings.py. Secure SSO firma l'utente lato server con HMAC‑SHA256 usando il tuo segreto API ed è raccomandato.

FASTCOMMENTS = {
    "TENANT_ID": os.environ["FASTCOMMENTS_TENANT_ID"],
    "API_KEY": os.environ["FASTCOMMENTS_API_KEY"],   # il tuo segreto API; firma Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Mappa i campi FastComments al tuo modello utente. I valori possono essere un attributo
        # nome, un percorso puntato ("profile.avatar_url"), una callable(user), o 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, o percorso puntato
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, o percorso puntato
    },
}

Scegli deliberatamente l'id SSO. L'id di FastComments è l'identificatore permanente per la cronologia dei commenti di un utente. Il USER_MAP predefinito lo mappa alla tua chiave primaria Django per comodità zero‑config, ma le PK intere sequenziali sono enumerabili e difficili da modificare in seguito (cambiare l'id di un utente divide la sua cronologia in un nuovo account). Per qualsiasi uso oltre una demo, mappa l'id a un valore stabile e opaco scelto in anticipo (un UUID o un ID pubblico dedicato), e non inserire mai dati privati al suo interno. L'app di esempio utilizza un id basato sul nome utente per questo motivo.

SSO viene inserito automaticamente in {% fastcomments %}, {% fastcomments_live_chat %}, {% fastcomments_collab_chat %}, {% fastcomments_image_chat %} e {% fastcomments_user_activity %} per l'utente corrente.

Gli URL di login/logout mostrati ai visitatori non autenticati sono per impostazione predefinita reverse("login") / reverse("logout"); sovrascrivili con SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

Mappatura personalizzata

Due opzioni con precedenza più alta hanno la precedenza su USER_MAP:

  • Un metodo sul tuo modello utente (l'analogo Pythonico di un'interfaccia):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • Un mapper globale, un percorso puntato a callable(user) -> dict:

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

La precedenza è USER_MAPPER > to_fastcomments_user_data() > USER_MAP.

Accesso API lato server Internal Link


Con l'extra [api] installato, chiama l'API REST di FastComments tramite l'SDK, pre‑configurato con la tua chiave API e la regione:

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)

Regione UE Internal Link


Imposta REGION per indirizzare i widget e l'API verso l'UE:

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

Personalizzare il markup incorporato Internal Link


Sovrascrivi fastcomments/widget.html posizionando la tua copia più in alto nel percorso di ricerca dei template (un progetto templates/fastcomments/widget.html). Questo è l'analogo Django di vendor:publish --tag=fastcomments-views di Laravel.

Riferimento alle impostazioni Internal Link

KeyDefaultDescription
TENANT_ID""Il tuo tenant ID di FastComments (demo per i test).
API_KEY""Il tuo segreto API. Firma Secure SSO e autentica admin().
REGIONNoneNone per gli Stati Uniti, "eu" per la regione UE.
SSO.ENABLEDFalseAttiva SSO.
SSO.MODE"secure""secure" (HMAC) o "simple" (non firmato).
SSO.LOGIN_URL / SSO.LOGOUT_URLNoneMostrato ai visitatori non autenticati; predefinito a reverse("login"/"logout").
SSO.USER_MAPid/email/usernameCampo FastComments all'attributo/percorso/funzione dell'utente.
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDSNonecallable(user) o percorso puntato.
SSO.USER_MAPPERNonePercorso puntato a callable(user) -> dict; precedenza più alta.
WIDGET_DEFAULTS{}Configurazione unita a ogni widget (chiavi camelCase).

Progetto di esempio Internal Link


Una demo eseguibile si trova in example/: un'app a colonna laterale sinistra + stage principale con una pagina per widget e una pagina di accesso che elenca gli utenti demo pre‑caricati.
Accedi con uno qualsiasi di loro e i widget di commento e chat live autenticano quell’identità tramite Secure SSO. Da quella 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

Senza una chiave API segreta, ricade sul tenant pubblico demo (anonimo).
example/browser_smoke.py è un test end‑to‑end Playwright che carica la pagina in un browser reale e pubblica un commento come utente Secure‑SSO.

Hai bisogno di aiuto?

Se riscontri problemi o hai domande sul pacchetto Django, per favore:

Contribuire

I contributi sono benvenuti! Visita il repository GitHub per le linee guida per contribuire.