FastComments.com

Προσθήκη σχολίων στην εφαρμογή Django

Αυτή είναι η επίσημη πακέτο Django για το FastComments.

Στοιχεία ζωντανής σχολιασμού και συνομιλίας με ασφαλή SSO μέσω ετικετών προτύπων.

Αποθετήριο

Προβολή στο GitHub

Πράκτορες κώδικα AI Internal Link

skills.sh

Δώστε στον πράκτορα κώδικά σας το πλαίσιο FastComments που χρειάζεται - widgets, configuration, Secure SSO, το REST API και τα SDKs:

npx skills add fastcomments/skills

Λειτουργεί με το Claude Code, Codex, Cursor, Copilot, Gemini και κάθε άλλο πράκτορα που υποστηρίζει το skills CLI.

Απαιτήσεις Internal Link

  • Python 3.10+
  • Django 4.2, 5.0, 5.1, ή 5.2
  • Ένα FastComments tenant ID (χρησιμοποιήστε demo για δοκιμή χωρίς λογαριασμό)
  • Απαιτείται ένα API secret μόνο για Secure SSO

Εγκατάσταση Internal Link

Εγκατάσταση από ετικέτα έκδοσης (αυτό το έργο διανέμεται μέσω ετικετών git, όχι μέσω PyPI):

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

Για πρόσβαση REST από την πλευρά του διακομιστή (οι βοηθητικές συναρτήσεις admin() / public_api()), προσθέστε το πρόσθετο api, το οποίο φέρνει τον παραγόμενο πελάτη του SDK:

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

Προσθέστε την εφαρμογή στο INSTALLED_APPS:

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

Γρήγορη εκκίνηση Internal Link

Διαμορφώστε το ενοικιαστή σας στο settings.py:

import os

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

Τοποθετήστε το widget σε οποιοδήποτε πρότυπο:

{% load fastcomments %}

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

Προαπαιτούμενα για αυτόματο SSO Internal Link

Για να περάσετε τον συνδεδεμένο χρήστη στο widget αυτόματα, οι ετικέτες διαβάζουν τον τρέχοντα χρήστη από το αίτημα. Βεβαιωθείτε ότι το έργο σας περιλαμβάνει και τα δύο (είναι ενεργοποιημένα εξ ορισμού σε ένα τυπικό έργο Django):

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

Χωρίς ένα αίτημα στο πλαίσιο του προτύπου, τα widgets αποδίδονται για έναν ανώνυμο επισκέπτη. Μπορείτε πάντα να περάσετε έναν χρήστη ρητά: {% fastcomments user=some_user %}.

Ετικέτες widget Internal Link

Κάθε widget έχει τη δική του ετικέτα. Όλα αποδεχθούν extra ορίσματα λέξεων‑κλειδιών, τα οποία ενσωματώνονται στη διαμόρφωση του widget όπως είναι (χρησιμοποιήστε κλειδιά camelCase) για οτιδήποτε δεν καλύπτεται από τα ονομαστικά ορίσματα παρακάτω.

ΕτικέταWidget
{% fastcomments %}Σχόλια
{% fastcomments_live_chat %}Ζωντανή συνομιλία
{% fastcomments_comment_count %}Ένδειξη αριθμού σχολίων
{% fastcomments_comment_count_bulk %} + {% fastcomments_count_marker %}Μαζικοί μετρητές σχολίων
{% fastcomments_collab_chat target="#el" %}Συνεργατική (ενσωματωμένη) συνομιλία
{% fastcomments_image_chat target="#el" %}Συνομιλία σχολιασμού εικόνας
{% fastcomments_recent_comments %}Πρόσφατα σχόλια
{% fastcomments_recent_discussions %}Πρόσφατες συζητήσεις
{% fastcomments_reviews_summary %}Περίληψη αξιολογήσεων
{% fastcomments_top_pages %}Σελίδες με τις περισσότερες συζητήσεις
{% fastcomments_user_activity user_id="..." %}Ροή δραστηριότητας χρήστη

Τα ονομαστικά ορίσματα αντιστοιχούν στα κλειδιά camelCase της διαμόρφωσης του widget:

ΠαράμετροςΚλειδί ρυθμίσεωνΕτικέτες
url_idurlIdσχόλια, ζωντανή συνομιλία, ένδειξη αριθμού, συνεργατική/εικόνα συνομιλία, πρόσφατα σχόλια, περίληψη αξιολογήσεων
urlurlσχόλια, ζωντανή συνομιλία, συνεργατική/εικόνα συνομιλία
readonlyreadonlyσχόλια, ζωντανή συνομιλία, συνεργατική/εικόνα συνομιλία
localelocaleσχόλια, ζωντανή συνομιλία, συνεργατική/εικόνα συνομιλία, δραστηριότητα χρήστη
has_dark_backgroundhasDarkBackgroundόλα
default_sort_directiondefaultSortDirectionσχόλια, ζωντανή συνομιλία, συνεργατική/εικόνα συνομιλία
number_onlynumberOnlyένδειξη αριθμού
is_liveisLiveένδειξη αριθμού
countcountπρόσφατα σχόλια, πρόσφατες συζητήσεις
target(querySelector, not sent)συνεργατική συνομιλία, εικόνα συνομιλία
chat_square_percentagechatSquarePercentageεικόνα συνομιλία
user_iduserIdδραστηριότητα χρήστη

Παραδείγματα:

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

{# Η Συνεργατική συνομιλία προσδένεται σε ένα υπάρχον στοιχείο στη σελίδα #}
<article id="post-body">...</article>
{% fastcomments_collab_chat target="#post-body" %}

{# Μαζικοί μετρητές: τοποθετήστε δείκτες, στη συνέχεια ένας μαζικός φορτωτής τα γεμίζει όλα #}
{% 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

Ενεργοποιήστε το SSO και επιλέξτε λειτουργία στο settings.py. Το Secure SSO υπογράφει τον χρήστη server-side με HMAC-SHA256 χρησιμοποιώντας το API secret σας και συνιστάται.

FASTCOMMENTS = {
    "TENANT_ID": os.environ["FASTCOMMENTS_TENANT_ID"],
    "API_KEY": os.environ["FASTCOMMENTS_API_KEY"],   # το API secret σας· υπογράφει το Secure SSO
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # Αντιστοιχίστε τα πεδία του FastComments στο μοντέλο χρήστη σας. Οι τιμές μπορεί να είναι
        # όνομα attribute, dotted path ("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, ή dotted path
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, ή dotted path
    },
}

Επιλέξτε το SSO id σκόπιμα. Το id του FastComments είναι η μόνιμη ταυτότητα για το ιστορικό σχολίων ενός χρήστη. Το προεπιλεγμένο USER_MAP το αντιστοιχίζει στο Django primary key σας για ευκολία χωρίς ρυθμίσεις, αλλά οι διαδοχικοί ακέραιοι PKs είναι ευρετήασιμοι και δύσκολο να αλλάξουν αργότερα (η αλλαγή του id ενός χρήστη διαχωρίζει το ιστορικό του σε νέο λογαριασμό). Για οτιδήποτε πέρα από ένα demo, αντιστοιχίστε το id σε μια σταθερή, αδιαφανή τιμή που επιλέγεται εξαρχής (UUID ή ειδικό public id), και μην βάλετε ποτέ ιδιωτικά δεδομένα σε αυτό. Η εφαρμογή παράδειγμα χρησιμοποιεί id βασισμένο σε username για αυτόν τον λόγο.

Το SSO εισάγεται αυτόματα στα {% fastcomments %}, {% fastcomments_live_chat %}, {% fastcomments_collab_chat %}, {% fastcomments_image_chat %}, και {% fastcomments_user_activity %} για τον τρέχοντα χρήστη.

Τα URL login/logout που εμφανίζονται σε επισκέπτες χωρίς σύνδεση έχουν προεπιλογή τα reverse("login") / reverse("logout")· παρακάμψτε τα με SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

Προσαρμοσμένη αντιστοίχιση

Δύο επιλογές με υψηλότερη προτεραιότητα υπερισχύουν του USER_MAP:

  • Μια μέθοδος στο μοντέλο χρήστη σας (το Pythonic αντίστοιχο μιας διεπαφής):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • Ένας καθολικός mapper, ένα dotted path σε callable(user) -> dict:

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

Η προτεραιότητα είναι USER_MAPPER > to_fastcomments_user_data() > USER_MAP.

Πρόσβαση API από την πλευρά του διακομιστή Internal Link

Με το πρόσθετο [api] εγκατεστημένο, καλέστε το FastComments REST API μέσω του SDK, προ‑ρυθμισμένο με το κλειδί API και την περιοχή σας:

from fastcomments_django import admin, public_api, get_manager

admin().get_comments("YOUR_TENANT_ID", ...)     # αυθεντικοποιημένο (DefaultApi)
public_api().get_comments_public(...)            # δημόσιο (PublicApi)

# Δημιουργήστε ένα token SSO για κλήσεις API ή παράδοση πελάτη:
token = get_manager().sso().token_for(request.user)

Περιοχή ΕΕ Internal Link

Ορίστε το REGION για να δρομολογήσετε τα widgets και το API στην ΕΕ:

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

Προσαρμογή του ενσωματωμένου markup Internal Link

Αντικαταστήστε το fastcomments/widget.html τοποθετώντας το δικό σας αντίγραφο νωρίτερα στη
διαδρομή αναζήτησης προτύπων (ένα project templates/fastcomments/widget.html). Αυτό είναι
το Django αντίστοιχο του Laravel's vendor:publish --tag=fastcomments-views.

Αναφορά ρυθμίσεων Internal Link

KeyDefaultDescription
TENANT_ID""Το tenant ID του FastComments (demo για δοκιμή).
API_KEY""Το μυστικό API σας. Υπογράφει το 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{}Διαμόρφωση ενσωματωμένη σε κάθε widget (κλειδιά camelCase).

Παράδειγμα έργου Internal Link

Μια εκτελέσιμη παρουσίαση βρίσκεται στο example/: μια εφαρμογή με αριστερή μπάρα + κύριο σκηνικό με μια σελίδα ανά widget και μια σελίδα σύνδεσης που εμφανίζει προ-σπόρους χρήστες demo.
Συνδεθείτε με οποιονδήποτε από αυτούς και τα widgets σχολίων και ζωντανής συνομιλίας επαληθεύουν αυτήν την ταυτότητα μέσω Secure SSO. Από αυτόν τον φάκελο:

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

Χωρίς μυστικό API επιστρέφει στον δημόσιο demo ενοικιαστή (ανώνυμο).
example/browser_smoke.py είναι ένα Playwright e2e που φορτώνει τη σελίδα σε πραγματικό πρόγραμμα περιήγησης και στέλνει ένα σχόλιο ως ο χρήστης Secure-SSO.

Χρειάζεστε βοήθεια;

Αν αντιμετωπίσετε προβλήματα ή έχετε ερωτήσεις σχετικά με το πακέτο Django, παρακαλούμε:

Συνεισφορά

Οι συνεισφορές είναι ευπρόσδεκτες! Παρακαλούμε επισκεφθείτε το αποθετήριο GitHub για οδηγίες συνεισφοράς.