django-allauth入門ガイド。基本設定からCustomUser・テンプレート・メール検証・ログアウトまで
Djangoでログイン・サインアップ機能を実装する定番ライブラリ django-allauth の使い方を、この記事1本にまとめて解説します。
- インストールと基本設定(ログイン機能の最小構成)
- CustomUserモデルを使用した認証
- テンプレートHTMLのカスタマイズ
- メールアドレス検証(verification)の必須化
- /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の修正
TEMPLATES の DIRS にコピー先を追記します。
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開発の基本操作まとめを参考にしてください。