FastComments.com

Django 앱에 댓글 추가


이는 FastComments용 공식 Django 패키지입니다.

템플릿 태그를 통해 보안 SSO가 적용된 실시간 댓글 및 채팅 구성 요소입니다.

Repository

GitHub에서 보기


요구 사항 Internal Link


  • Python 3.10+
  • Django 4.2, 5.0, 5.1, 또는 5.2
  • FastComments 테넌트 ID (demo를 사용해 계정 없이 체험 가능)
  • Secure SSO에 대해서만 API 비밀키가 필요합니다

설치 Internal Link


릴리스 태그에서 설치하기 (이 프로젝트는 PyPI가 아니라 git 태그를 통해 배포됩니다):

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"),
}

위젯을 모든 템플릿에 삽입합니다:

{% load fastcomments %}

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

자동 SSO를 위한 사전 요구 사항 Internal Link


로그인한 사용자를 위젯에 자동으로 전달하려면, 태그가 요청(request)에서 현재 사용자를 읽어옵니다. 프로젝트에 아래 두 항목이 모두 포함되어 있는지 확인하세요(표준 Django 프로젝트에서는 기본적으로 활성화되어 있습니다):

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

템플릿 컨텍스트에 요청이 없으면, 위젯은 익명 방문자용으로 렌더링됩니다. 항상 명시적으로 사용자를 전달할 수 있습니다: {% fastcomments user=some_user %}.

위젯 태그 Internal Link

Every widget has its own tag. All of them accept **extra keyword arguments, 이는 위젯 구성에 그대로 병합되며 (camelCase 키 사용) 아래에 명시된 명명된 인수로 다루어지지 않는 모든 경우에 적용됩니다.

태그위젯
{% 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 구성 키에 매핑됩니다:

인수구성 키태그
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

Enable SSO and choose a mode in settings.py. Secure SSO signs the user server-side with HMAC-SHA256 using your API secret and is recommended.

FASTCOMMENTS = {
    "TENANT_ID": os.environ["FASTCOMMENTS_TENANT_ID"],
    "API_KEY": os.environ["FASTCOMMENTS_API_KEY"],   # API 비밀 키; Secure SSO에 서명합니다
    "SSO": {
        "ENABLED": True,
        "MODE": "secure",                            # "secure" | "simple"
        # FastComments 필드를 사용자 모델에 매핑합니다. 값은 속성 이름, 점 표기 경로("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, 또는 점 표기 경로
        "IS_MODERATOR": None,
        "GROUP_IDS": None,                           # callable(user) -> list, 또는 점 표기 경로
    },
}

SSO id를 신중하게 선택하십시오. FastComments id는 사용자의 댓글 기록에 대한 영구적인 핸들입니다. 기본 USER_MAP은 편리성을 위해 이를 Django 기본키에 매핑하지만, 순차적인 정수 PK는 열거 가능하고 나중에 변경하기 어렵습니다(사용자의 id를 변경하면 기록이 새 계정으로 분리됩니다). 데모를 넘어서는 경우, id를 사전에 선택한 안정적이고 불투명한 값(예: UUID 또는 전용 공개 ID)으로 매핑하고 절대 비공개 데이터를 넣지 마세요. 예제 앱은 이 이유로 사용자 이름 기반 ID를 사용합니다.

SSO는 현재 사용자를 위해 {% fastcomments %}, {% fastcomments_live_chat %}, {% fastcomments_collab_chat %}, {% fastcomments_image_chat %}, 그리고 {% fastcomments_user_activity %}에 자동으로 주입됩니다.

Login/logout URLs shown to signed-out visitors default to reverse("login") / reverse("logout"); override them with SSO["LOGIN_URL"] / SSO["LOGOUT_URL"].

사용자 정의 매핑

Two higher-precedence options beat USER_MAP:

  • 사용자 모델에 정의된 메서드 (인터페이스와 유사한 파이썬 방식):

    class User(AbstractUser):
        def to_fastcomments_user_data(self):
            return {"id": self.pk, "email": self.email, "username": self.get_username()}
  • 전역 매퍼, callable(user) -> dict에 대한 점 표기 경로:

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

USER_MAPPER > to_fastcomments_user_data() > USER_MAP 순으로 우선순위가 적용됩니다.

서버 측 API 접근 Internal Link

[api] 추가 기능이 설치된 경우, SDK를 통해 FastComments REST API를 호출하십시오,
API 키와 지역이 사전 구성되어 있습니다:

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 지역 Internal Link

REGION을 설정하여 위젯과 API를 EU로 라우팅합니다:

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

임베드 마크업 맞춤 설정 Internal Link


fastcomments/widget.html을 자신의 복사본을 더 먼저 배치하여 재정의합니다 템플릿 검색 경로 (프로젝트 templates/fastcomments/widget.html). 이것은 Laravel의 vendor:publish --tag=fastcomments-views에 해당하는 Django 유사 기능입니다.

설정 레퍼런스 Internal Link

KeyDefaultDescription
TENANT_ID""FastComments 테넌트 ID (demo는 테스트용).
API_KEY""API 비밀 키. Secure SSO에 서명하고 admin()을 인증합니다.
REGIONNoneNone은 미국, "eu"는 EU 지역을 의미합니다.
SSO.ENABLEDFalseSSO를 켭니다.
SSO.MODE"secure""secure" (HMAC) 또는 "simple" (서명되지 않음).
SSO.LOGIN_URL / SSO.LOGOUT_URLNone로그아웃된 방문자에게 표시됩니다; 기본값은 reverse("login"/"logout")입니다.
SSO.USER_MAPid/email/usernameFastComments 필드가 사용자 속성/경로/콜러블에 매핑됩니다.
SSO.IS_ADMIN / IS_MODERATOR / GROUP_IDSNonecallable(user) 또는 점 표기 경로.
SSO.USER_MAPPERNonecallable(user) -> dict에 대한 점 표기 경로; 가장 높은 우선순위.
WIDGET_DEFAULTS{}모든 위젯에 병합되는 구성 (camelCase 키).

예제 프로젝트 Internal Link

A runnable showcase lives in example/: a left-rail + main-stage app with a page per widget and a sign-in page listing pre-seeded demo users.
Sign in as any of them and the comment and live-chat widgets authenticate that identity via Secure SSO.
From that directory:

python manage.py migrate
# 자체 테넌트를 사용하여 Secure SSO가 작동하는 것을 확인하세요 (API 비밀키가 이를 활성화합니다):
FASTCOMMENTS_TENANT_ID=... FASTCOMMENTS_API_KEY=... python manage.py runserver

Without an API secret it falls back to the public demo tenant (anonymous).
example/browser_smoke.py is a Playwright e2e that loads the page in a real browser and posts a comment as the Secure-SSO user.

도움이 필요하신가요?

문제가 발생하거나 Django 패키지에 대해 질문이 있으시면 다음을 참고해 주세요:

기여하기

기여를 환영합니다! 기여 가이드라인은 GitHub 저장소를 방문해 주세요.