LoginSignup
29
33

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

Last updated at Posted at 2020-06-01

概要

  • 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

29
33
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
33