【Django】allauthのadapterをカスタマイズする方法

※本サイトにはプロモーション・広告が含まれています。

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

django-allauthのadapterについて知りたい!」という方へ、ACCOUNT_ADAPTERの基本を解説します

当記事を通じて、

  • adapterでできること
  • adapterの書き方
  • adapterのカスタマイズ 実例

について紹介していきます

公式ドキュメントでは、ACCOUNT_ADAPTERについて、自身で作成したアダプタクラスを使い、デフォルトで決められている動作に変更を加えることができる、と書いてあります

まずはデフォルトのアダプタ「DefaultAccountAdapterで何ができるか」を見ていきます!

✔YouTube解説動画

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

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

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

筆者プロフィール

筆者プロフィールアイコン

【現職】プロジェクトマネージャー/SE(元外資系金融機関営業)

【副業】ブログ(月間15万PV)/YouTube/Web・アプリ制作

コミュニケーション × ビジネススキル × 文章力 × プログラミングスキルを活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

何ができるのか?

DefaultAccountAdapterで用意されているメソッドの中で代表的なものは下記の通りです

  • ログイン後のリダイレクト先の変更
  • ログアウト後のリダイレクト先の変更
  • Eメール確認後のリダイレクト先変更
  • 新規登録後のリダイレクト先変更

get_login_redirect_url(self, request)

ログイン後のリダイレクト先を指定するメソッドです

def get_login_redirect_url(self, request):
    """
    Returns the default URL to redirect to after logging in.  Note
    that URLs passed explicitly (e.g. by passing along a `next`
    GET parameter) take precedence over the value returned here.
    """
    assert request.user.is_authenticated
    url = getattr(settings, "LOGIN_REDIRECT_URLNAME", None)
    if url:
        warnings.warn(
            "LOGIN_REDIRECT_URLNAME is deprecated, simply"
            " use LOGIN_REDIRECT_URL with a URL name",
            DeprecationWarning,
        )
    else:
        url = settings.LOGIN_REDIRECT_URL
    return resolve_url(url)

ソースコードから抜粋)

get_logout_redirect_url (self, request)

ログアウト後のリダイレクト先を指定するメソッドです

def get_logout_redirect_url(self, request):
    """
    Returns the URL to redirect to after the user logs out. Note that
    this method is also invoked if you attempt to log out while no users
    is logged in. Therefore, request.user is not guaranteed to be an
    authenticated user.
    """
    return resolve_url(app_settings.LOGOUT_REDIRECT_URL)

ソースコードから抜粋)

get_email_confirmation_redirect_url (self, request)

メールアドレスの確認後のリダイレクト先を指定するメソッドです

def get_email_confirmation_redirect_url(self, request):
    """
    The URL to return to after successful e-mail confirmation.
    """
    if request.user.is_authenticated:
        if app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL:
            return app_settings.EMAIL_CONFIRMATION_AUTHENTICATED_REDIRECT_URL
        else:
            return self.get_login_redirect_url(request)
    else:
        return app_settings.EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL

ソースコードから抜粋)

get_signup_redirect_url (self, request)

新規登録完了後のリダイレクト先を指定するメソッドです

def get_signup_redirect_url(self, request):
    return resolve_url(app_settings.SIGNUP_REDIRECT_URL)

ソースコードから抜粋)

次章で、カスタマイズ方法を見ていきます

アダプタをカスタマイズする

まずは、下記の通りファイルを作成します

accounts > adapter.py

adapter.pyに記述をしていきます

from allauth.account.adapter import DefaultAccountAdapter

class MyNippoAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        return #リダイレクトしたいURL

(get_login_redirect_urlの例)

記述が終わりましたら、settings.pyで下記を追記します

ACCOUNT_ADAPTER = "accounts.adapter.MyNippoAdapter"

次章、実例を紹介します

日報アプリで使ってみよう!達成すること

現在開発中の日報アプリには、ユーザークラスと拡張クラスである「Profile」クラスが存在します

ユーザー登録をした直後は、Profileクラスはまだ作られていません

ログイン時に、Profileの有無によりリダイレクト先を変更していきます

【実例】ログイン先のREDIRECT_URLを変更する

ユーザーがプロフィールを持っている場合は、そのまま一覧ページへ進みます

持っていない場合は、プロフィール作成ページへ飛びます

【adpter.py】

from allauth.account.adapter import DefaultAccountAdapter
from django.urls import reverse_lazy

class MyNippoAdapter(DefaultAccountAdapter):
    def get_login_redirect_url(self, request):
        resolved_url = super().get_login_redirect_url(request)
        user_obj = request.user
        profile_obj = user_obj.profile
        if user_obj.email == profile_obj.username:
            resolved_url = reverse_lazy("profile-update", kwargs={"pk":profile_obj.pk})
        return resolved_url

settings.pyの「ACCOUNT_ADAPTER」へ作成したクラスを格納して完了

細かい解説は省きますが、参考になれば幸いです

おわりに

アダプタのカスタマイズは、

  • アダプタを継承したクラスでメソッドの上書き
  • settings.py「ACCOUNT_ADAPTER」へ格納

という2ステップで完了します

覚えておくと、色々な場面で柔軟に対応できますので便利です!

さて、次回はユーザーやプロフィールクラスなどについてのテストプログラムについて実際のコードを紹介していきます

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