django-allauthでログイン機能(ユーザ認証機能)を実装する

概要

  • Djangoのログイン機能(ユーザ認証)の実装には、標準のdjango.contrib.authがある。(公式ページ)
  • django-allauthを使うと、簡単に実装できる
    • TwitterアカウントやGitHubアカウントなどでもログインできる。公式ページドキュメントを参照。個別に設定が必要なので、今回は割愛。
  • 今回は、メルアドとパスワードでの認証にする

環境

  • 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 も実行)

ブラウザで動作確認

ユーザ名を表示する

  • テンプレートに以下を追加すると、ログイン中のユーザ名が表示できる
{% load account %}

{% user_display user %}

ユーザ認証関連のテンプレートファイルの配置

  • templatesというフォルダに各アプリのテンプレートをまとめて配置してあるとして、
  • cp -r /usr/local/lib/python3.6/dist-packages/allauth/templates/account templates/

参考書籍

参考URL

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です