FastComments.com

Django アプリにコメントを追加する

これは FastComments の公式 Django パッケージです。

テンプレートタグを使用した安全な SSO を備えたライブコメントおよびチャットコンポーネントです。

Repository

GitHub で見る

AI コーディングエージェント Internal Link

skills.sh

コーディングエージェントに必要な FastComments のコンテキスト(ウィジェット、設定、Secure SSO、REST API、SDK)を提供します:

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 のテナント ID(demo を使用してアカウントなしで試す)
  • Secure SSO のみ、API secret が必要です

インストール 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

ログインしたユーザーをウィジェットに自動的に渡すには、タグはリクエストから現在のユーザーを
取得します。プロジェクトに以下の2つが設定されていることを確認してください(
標準的な Django プロジェクトではデフォルトで有効になっています):

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

テンプレートコンテキストにリクエストが無い場合、ウィジェットは匿名の
訪問者向けにレンダリングされます。常にユーザーを明示的に渡すこともできます: {% fastcomments user=some_user %}.

ウィジェットタグ Internal Link

すべてのウィジェットにはそれぞれ専用のタグがあります。いずれも **extra キーワード引数を受け付けます。これは、以下の名前付き引数でカバーされていない項目について、ウィジェットの設定にそのままマージされます(キーは 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、送信されません)コラボチャット、画像チャット
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

settings.py でSSOを有効にし、モードを選択します。Secure SSOはAPIシークレットを使用してHMAC-SHA256でサーバー側からユーザーに署名する方式で、推奨されています。

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 %} に自動的に注入されます。

ログアウト状態の訪問者に表示されるログイン/ログアウトURLは、デフォルトで reverse("login") / reverse("logout") になります。SSO["LOGIN_URL"] / SSO["LOGOUT_URL"] で上書きできます。

カスタムマッピング

USER_MAP よりも優先される2つの上位オプションがあります:

  • ユーザーモデル上のメソッド(インターフェースのPython的な相当物):

    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", ...)     # 認証済み (DefaultApi)
public_api().get_comments_public(...)            # 公開 (PublicApi)

# API 呼び出しまたはクライアントハンドオフ用に SSO トークンを生成:
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

キーデフォルト説明
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

実行可能なデモはexample/にあります: 左側レール + メインステージ
ウィジェットごとにページがあるアプリで、事前にシードされたデモユーザーを一覧表示するサインインページです。
それらのいずれかでサインインすると、コメントとライブチャットウィジェットがその
ID を 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 リポジトリをご覧ください。