概要
- Djangoのログイン機能(ユーザ認証)の実装には、標準のdjango.contrib.authがある。(公式ページ)
- 
django-allauthを使うと、簡単に実装できる
- 今回は、メルアドとパスワードでの認証にする
環境
- Python 3.6.9 (2019-07-02)
- Django 3.0.3 (2020-02-03)
- django-allauth 0.41.0 (2019-12-18)
準備
- django-adminのstartprojectで、プロジェクトを作成しておく
- manage.pyのcreatesuperuserで、管理者ユーザを作成しておく
- パスワードリセットのメールを送信するので、メールアカウントを作成しておく(Gmailとか)
- Gmailを使う場合は「安全性の低いアプリのアクセス」を「有効」にしておく必要がある
 
django-allauth のインストール
- pip install django-allauth
- 必要に応じて、pip freeze > requirements.txtでパッケージリストを更新
実装
settings.py の変更
- INSTALLED_APPS に以下を追加
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',    # ソーシャル連携認証を使っていない場合でも必要
- TEMPLATES の'context_processors'内に以下を追加
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                # `allauth` needs this from django
                'django.template.context_processors.request',
            ],
        },
- メルアドとパスワードで認証するために、認証バックエンドを設定
 MIDDLEWAREの設定の次あたりに、以下を追加(公式サイトでは丸カッコではなく角カッコなので注意)
AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'allauth.account.auth_backends.AuthenticationBackend',
]
- 一番下に以下を追加
# sitesフレームワーク用のサイトID
SITE_ID = 1
# ログイン・ログアウト時のリダイレクト先
LOGIN_REDIRECT_URL = 'home'
ACCOUNT_LOGOUT_REDIRECT_URL = '/accounts/login/'
# 認証方式を「メルアドとパスワード」に設定
ACCOUNT_AUTHENTICATION_METHOD = 'email'
# ユーザ名は使用しない
ACCOUNT_USERNAME_REQUIRED = False
# ユーザ登録時に確認メールを送信するか(none=送信しない, mandatory=送信する)
ACCOUNT_EMAIL_VERIFICATION = 'none'
ACCOUNT_EMAIL_REQUIRED = True   # ユーザ登録にメルアド必須にする
urls.py の修正
- 以下を追加
from django.urls import include, path   # includeを追加
from django.views.generic import TemplateView   # 追加
- urlpatterns に以下を追加
    path('', TemplateView.as_view(template_name='home.html'), name='home'),
    path('accounts/', include('allauth.urls')),
    # path('accounts/', include('django.contrib.auth.urls')), # 不要
基底テンプレートの修正
- templates/base.html 内のbodyブロックの下に、以下を追加
      {% block content %}
      {% endblock %}
homeテンプレートの追加
- templates/home.html を作成する
{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% load static %}
{% block body %}
this is home.html
{% endblock %}
DBにマイグレーション実行
- python3 manage.py migrate
(直前にDB初期化した場合は、createsuperuser も実行)
ブラウザで動作確認
- 
webサーバ起動 
 python3 manage.py runserver 0.0.0.0:8000
- 
ログイン画面からログイン 
 http://localhost:8000/accounts/login/ を開く- ここでログイン画面が表示されず、home(http://localhost:8000) に飛ばされる場合は、すでにログイン済みなので、クッキーを消すか、http://localhost:8000/accounts/logout/ を表示して、「Sign Out」ボタンを押してログアウトする)
 
ユーザ名を表示する
- テンプレートに以下を追加すると、ログイン中のユーザ名が表示できる
{% load account %}
{% user_display user %}
ユーザ認証関連のテンプレートファイルの配置
- templatesというフォルダに各アプリのテンプレートをまとめて配置してあるとして、
- cp -r /usr/local/lib/python3.6/dist-packages/allauth/templates/account templates/
参考書籍
- 「現場で使えるDjangoの教科書 実践編」、横瀬昭仁・著
参考URL
- 
- 記事が2015年と古いが、ログイン済みユーザのみ閲覧できるページ(login_requiredデコレータ)や、Userモデルのカスタマイズなどが書かれている。
 
- 記事が2015年と古いが、ログイン済みユーザのみ閲覧できるページ(
- 
爆速で作れるDjangoユーザ認証機能【django-allauth】 - テンプレートの書き換えが、「\venv<仮想環境名>\Lib\site-packages\allauth\templates」を直接書き換えるように書かれているので、デプロイ時に注意。