
Lingua 🇮🇹 Italiano
Documentazione
Primi passi
Uso
Riferimento API
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
Requisiti 
- Python 3.10+
- Django 4.2, 5.0, 5.1, o 5.2
- Un ID tenant FastComments (usa
demoper provarlo senza un account) - Un segreto API è richiesto solo per Secure SSO
Installazione 
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 
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 
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.requestinTEMPLATES["OPTIONS"]["context_processors"]django.contrib.auth.middleware.AuthenticationMiddlewareinMIDDLEWARE
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 
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.
| Tag | Widget |
|---|---|
{% 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:
| Argument | Config key | Tags |
|---|---|---|
url_id | urlId | comments, live chat, comment count, collab/image chat, recent comments, reviews summary |
url | url | comments, live chat, collab/image chat |
readonly | readonly | comments, live chat, collab/image chat |
locale | locale | comments, live chat, collab/image chat, user activity |
has_dark_background | hasDarkBackground | all |
default_sort_direction | defaultSortDirection | comments, live chat, collab/image chat |
number_only | numberOnly | comment count |
is_live | isLive | comment count |
count | count | recent comments, recent discussions |
target | (querySelector, not sent) | collab chat, image chat |
chat_square_percentage | chatSquarePercentage | image chat |
user_id | userId | user 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) 
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'
idSSO. L'iddi FastComments è l'identificatore permanente per la cronologia dei commenti di un utente. IlUSER_MAPpredefinito 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'iddi un utente divide la sua cronologia in un nuovo account). Per qualsiasi uso oltre una demo, mappa l'ida 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 unidbasato 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 
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 
Imposta REGION per indirizzare i widget e l'API verso l'UE:
FASTCOMMENTS = {"TENANT_ID": "...", "REGION": "eu"}
Personalizzare il markup incorporato 
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 
| Key | Default | Description |
|---|---|---|
TENANT_ID | "" | Il tuo tenant ID di FastComments (demo per i test). |
API_KEY | "" | Il tuo segreto API. Firma Secure SSO e autentica admin(). |
REGION | None | None per gli Stati Uniti, "eu" per la regione UE. |
SSO.ENABLED | False | Attiva SSO. |
SSO.MODE | "secure" | "secure" (HMAC) o "simple" (non firmato). |
SSO.LOGIN_URL / SSO.LOGOUT_URL | None | Mostrato ai visitatori non autenticati; predefinito a reverse("login"/"logout"). |
SSO.USER_MAP | id/email/username | Campo FastComments all'attributo/percorso/funzione dell'utente. |
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDS | None | callable(user) o percorso puntato. |
SSO.USER_MAPPER | None | Percorso puntato a callable(user) -> dict; precedenza più alta. |
WIDGET_DEFAULTS | {} | Configurazione unita a ogni widget (chiavi camelCase). |
Progetto di esempio 
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.