django-allauth入門ガイド。基本設定からCustomUser・テンプレート・メール検証・ログアウトまで

django-allauth入門ガイド。基本設定からCustomUser・テンプレート・メール検証・ログアウトまで

Djangoでログイン・サインアップ機能を実装する定番ライブラリ django-allauth の使い方を、この記事1本にまとめて解説します。

  1. インストールと基本設定(ログイン機能の最小構成)
  2. CustomUserモデルを使用した認証
  3. テンプレートHTMLのカスタマイズ
  4. メールアドレス検証(verification)の必須化
  5. /logoutへのアクセスで即ログアウトさせる設定

前提として、Djangoがインストール済みで一般的な使い方を理解していること。環境はコンテナ・仮想環境いずれでも構いません。

1. インストールと基本設定

まずはpipでインストールします。

pip install django-allauth

settings.pyの設定

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # 既存の定義に加え、なければ以下を追記
                'django.template.context_processors.request',
            ],
        },
    },
]

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.messages',
    'django.contrib.sites',      # デフォルトでは書かれていないので追記
    'allauth',
    'allauth.account',
    'allauth.socialaccount',     # ソーシャルログインを使わなくても必要
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
]

SITE_ID = 1

# ログイン後のリダイレクトURL
LOGIN_REDIRECT_URL = '/'

# ログアウト後のリダイレクトURL
ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/'

urls.pyの設定

urlpatterns = [
    path('accounts/', include('allauth.urls')),
]

マイグレーション

python manage.py migrate

これで /accounts/login//accounts/signup/ などのログイン・サインアップ画面が使えるようになります。

2. CustomUserモデルを使用した認証

CustomUserとは?

  • 自ら定義したユーザーモデルでログインできる仕組み。使用しない場合はDjangoデフォルトのUserモデルが使われる
  • DjangoはCustomUserでの認証を推奨している(後からのユーザーモデル変更は困難なため)
  • 抽象クラス AbstractUser または AbstractBaseUser を継承して実現する

この記事では AbstractUser を使用します。AbstractBaseUser はDjangoの認証機能そのものの理解が必要になるため、allauthと組み合わせる用途では AbstractUser で十分です。

認証アプリの作成

python manage.py startapp custom_auth

models.py にCustomUserモデルを定義します。

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    class Meta(AbstractUser.Meta):
        db_table = 'custom_user'

admin.py にも登録します。

from django.contrib import admin
from .models import CustomUser

admin.site.register(CustomUser)

settings.pyの修正

INSTALLED_APPS = [
    # ...既存の設定...
    'custom_auth',  # 追加
]

AUTH_USER_MODEL = 'custom_auth.CustomUser'
ACCOUNT_EMAIL_VERIFICATION = 'none'  # メール検証は後の章で有効化

マイグレーション

python manage.py makemigrations custom_auth
python manage.py migrate custom_auth

次のエラーが発生する場合は、adminアプリのマイグレーションがCustomUserより先に適用されていることが原因です。

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'.

対処方法はDjangoのよくあるエラーと解決方法まとめを参照してください。

3. テンプレートHTMLのカスタマイズ

allauthのログイン・サインアップ画面のHTMLは、テンプレートの検索順序を利用してカスタマイズします。

テンプレートファイルをコピー

プロジェクト側にテンプレート用ディレクトリを作り、allauthパッケージ内のテンプレートをコピーします(パスのPythonバージョンは環境に合わせてください)。

mkdir -p templates/custom_auth

cd /usr/local/lib/python3.8/site-packages/allauth/templates/
cp -rp * /code/templates/custom_auth/.

settings.pyの修正

TEMPLATESDIRS にコピー先を追記します。

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            Path.joinpath(BASE_DIR, 'templates'),
            Path.joinpath(BASE_DIR, 'templates', 'custom_auth'),
        ],
        'APP_DIRS': True,
        # ...OPTIONSは基本設定のまま...
    },
]

あとは templates/custom_auth/account/ 配下のHTMLファイルを修正すれば画面に反映されます。

仕組みの解説

  • Djangoはまず TEMPLATES.DIRS で指定されたパス配下からテンプレートを検索する
  • 見つからなければ site-packages/allauth/templates/ 配下を検索する
  • 先に見つかったテンプレートが使われるため、プロジェクト側のコピーが優先される
  • パッケージ内のファイルを直接修正することもできるが、allauthのバージョンアップ時に変更が消えるため必ずコピー方式にする

4. メールアドレス検証(verification)の必須化

サインアップ時に確認メールを送り、リンクをクリックするまでログインさせない設定です。

事前にDjangoのメール送信設定(SMTPまたはconsoleバックエンド)が必要です。設定方法はDjangoの環境設定・運用まとめを参照してください。

settings.pyの設定

DEFAULT_FROM_EMAIL = 'sample@sample.com'        # 送信元メールアドレス
ACCOUNT_EMAIL_VERIFICATION = "mandatory"        # メールアドレス検証を必須化
ACCOUNT_EMAIL_REQUIRED = True                   # メールアドレス入力を必須化
ACCOUNT_EMAIL_SUBJECT_PREFIX = '[SITE] '        # メール件名のプレフィックス

カスタマイズできる箇所

  • 確認メールの本文: account/email/email_confirmation_message.txt
  • メール送信後に表示されるページ: account/verification_sent.html
  • メール内リンクをクリックした先の確認ページ: account/email_confirm.html

いずれも前章のテンプレートカスタマイズと同じ要領で、プロジェクト側にコピーしたファイルを編集します。

5. /logoutへのアクセスで即ログアウトさせる

デフォルトでは /accounts/logout/ にアクセスすると「ログアウトしますか?」という確認画面が表示されます。確認画面を挟まずGETアクセスで即ログアウトさせるには、settings.pyに次を追記します。

ACCOUNT_LOGOUT_ON_GET = True
ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/'  # ログアウト後のリダイレクト先

※GETでの状態変更となるため、CSRFの観点では確認画面を挟むデフォルト動作の方が安全です。利便性とのトレードオフを理解したうえで設定してください。

まとめ

やりたいこと設定
基本のログイン機能INSTALLED_APPS + AUTHENTICATION_BACKENDS + allauth.urls
独自ユーザーモデルAbstractUser 継承 + AUTH_USER_MODEL
画面のカスタマイズテンプレートをプロジェクト側へコピーして編集
メール検証の必須化ACCOUNT_EMAIL_VERIFICATION = "mandatory"
確認なしログアウトACCOUNT_LOGOUT_ON_GET = True

特定のViewへのアクセスをログイン必須にする方法はDjango開発の基本操作まとめを参考にしてください。

参考: django-allauth公式ドキュメント

技術ブログ一覧へ戻る