FastComments.com

Voeg reacties toe aan je Django-app


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

Live reacties en chatcomponenten met veilige SSO via sjabloontags.

Repository

Bekijk op GitHub


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

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

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

Enable SSO 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"],   # jouw API‑secret; ondertekent Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Koppel FastComments‑velden aan je gebruikersmodel. Waarden kunnen een attribuut
        # naam, 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 een dotted path
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, of een dotted path
    },
}

Kies de SSO id zorgvuldig. Het FastComments id is de permanente identifier voor de reactiegeschiedenis van een gebruiker. De standaard USER_MAP koppelt deze aan je Django‑primaire‑sleutel voor nul‑configuratiegemak, maar opeenvolgende gehele PK's zijn telbaar en moeilijk later te wijzigen (het wijzigen van een gebruikers id splitst hun geschiedenis over een nieuw account). Voor alles buiten een demo, koppel id aan een stabiele, ondoorzichtige waarde die vooraf wordt gekozen (een UUID of een toegewijde publieke id), en plaats daar nooit privé‑data in. De voorbeeld‑app gebruikt een op gebruikersnaam gebaseerd id om deze reden.

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 aan uitgelogde bezoekers worden getoond, wijzen standaard naar reverse("login") / reverse("logout"); overschrijf ze met SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

Custom mapping

Two higher-precedence options beat USER_MAP:

  • Een methode op je gebruikersmodel (de Python‑achtige analog 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"}}

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.