【django-allauth】ログイン・ログアウト機能のカスタマイズ

Django

(最終更新月:2022年12月)

✔当記事は以下のような方に向けて書かれています

「django-allauthでログイン・ログアウト方法をカスタマイズしたい」

「django-allauthのuser has no field named ‘username’を解決したい」

「django-allauthの実例が見たい」

✔当記事を通じてお伝えすること

  • django-allauthでEメールによる認証へ変更する方法
  • django-allauthで即ログアウト機能を実装する方法

当記事では、django-allauthのカスタマイズ方法として、ログイン・ログアウトなどの機能を実際に変更する方法を実例とともにご紹介します。

ぜひ最後までご覧ください。

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

✔YouTube解説動画

当記事の内容は動画を見ながら進めると、約15分程度で完了します。

動画ならではの情報も解説しているので、記事と一緒にご覧ください。

動画の概要欄には、単元ごとのコードを紹介しているgithubページも載せています。

django-allauth|ログインのカスタマイズ

まずは、ログイン方法をEメール認証へ変更します。

ユーザーモデルをカスタマイズしているのであれば、必ず必要な設定です。

以下4つの変数をsettings.pyで定義しましょう。

ACCOUNT_USER_MODEL_USERNAME_FIELD = None
ACCOUNT_USERNAME_REQUIRED = False 
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True

主には以下のことを宣言しています。

  • usernameフィールドが存在しない
  • 認証にはEメールアドレスを使う

ログインページへアクセスすると無事エラーがなくなりました。

ただしログイン後には以下のような404エラーが。

この理由は、ログイン時のリダイレクト設定がデフォルトのままなことが原因となっています。

/accounts/profile/

デフォルトの指定先が存在しないのです。

django-allauth|リダイレクト先を特定のページにする

LOGIN_REDIRECT_URL変数でログイン後のリダイレクト先を変更できます。

以下をsettings.pyに追記します。

from django.urls import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('nippo-list')

「日報一覧ページ」へリダイレクトするよう指定してます。

※動的に変更したい場合などはこちらの方法が使えます。

一緒にログアウト時のリダイレクト先も変更しましょう。

ACCOUNT_LOGOUT_REDIRECT_URL = reverse_lazy("account_login")

Eメールの確認を必須にする

Eメールの確認を必須にしたいのなら、以下のとおりとします。

ACCOUNT_EMAIL_VERIFICATION = "mandatory"

ACCOUNT_EMAIL_VERIFICATION変数で、メールアドレスの確認が済んでいないユーザーのログインを許可するかどうかが決められます。

  • optional:デフォルトの設定で、ログイン時に確認済みかどうかは問われない
  • mandatory:ログインするためには確認済みのメールアドレスでなければならない

認証が終了してるかどうかは、メールアドレスモデルクラス > verifiedフィールドで判断されます。

django-allauth|ログアウト機能のカスタマイズ

ログアウトのページ(accounts/logout/)へアクセスしたら、確認を経ずに即ログアウトとする機能があります。

なぜこの機能が使えるかというと、多くのWebアプリでは、ログアウト時にいちいち確認されないことが多いから。

以下をsettings.pyに書き込みます。

ACCOUNT_LOGOUT_ON_GET = True

ログアウトページにアクセスすると同時に以下の手順で処理がおこなわれます。

  • ログアウトの実行
  • ACCOUNT_LOGOUT_REDIRECT_URL先へ移行

まとめ

django-allauth機能のカスタマイズは以下の場面で必要です。

  • ユーザーモデルクラスをカスタマイズしている場合
  • メールアドレス認証を必須にしたい場合
  • ログイン・ログアウト時のリダイレクト先を指定したい場合
  • 即ログアウトとする機能を実装したい場合

コードはこちら。

#ユーザーネームは使わない
ACCOUNT_USERNAME_REQUIRED = False 
ACCOUNT_USER_MODEL_USERNAME_FIELD = None

#認証にはメールアドレスを使用する
ACCOUNT_AUTHENTICATION_METHOD = 'email'
ACCOUNT_EMAIL_REQUIRED = True

#ログイン後のリダイレクト先を指定
from django.urls import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('nippo-list')

#ログアウト後のリダイレクト先を指定
ACCOUNT_LOGOUT_REDIRECT_URL = reverse_lazy("account_login")

#メールアドレスが確認済みである必要がある
ACCOUNT_EMAIL_VERIFICATION = "mandatory"

#即ログアウトとする
ACCOUNT_LOGOUT_ON_GET = True

ご自由にコピペしてお使いください。

ただしこれでも、登録機能でエラーが発生します。

これは登録時のメール送信機能によるエラーです。

最終的には、メールを送信するよう設定しますが、次回ではターミナルでメールを表示する方法をご紹介します。

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCへ投げ銭をする

タイトルとURLをコピーしました