Django 認証用アプリケーションの作り方あれこれ

Contents

認証用アプリケーションとは

ログイン・ログアウトや、ユーザー登録を行うアプリケーションです。
ほかのアプリから標準的に使う機能として独立のアプリとするのが手筋のようです。

大きく2通りの実装方法があって、Djangoの解説書でも書籍によって別の方法で実装されていたので、まとめてみます。
以下の実装例では、 認証用アプリをaccountsというアプリ名にしています。

その1:認証用クラスベースビューをつかう

1つ目は、Djangoの標準機能である、 認証用クラスベースビューLoginView, LogoutViewを使った実装です。
実践Django Pythonによる本格Webアプリケーション開発 の「第1章 コードスニペット共有サイトの開発」では、この方法で実装されています。
Django公式ドキュメントのDjangoの認証システムを使用するにも、詳細な記述があります。

認証用クラスベースビューを使った実装方法

基本的な機能の実装はシンプルです。

認証用アプリを新規アプリケーションとして作成したら、アプリケーションのurls.pyを作成し、 LoginView, LogoutView をインポートしそれぞれを呼び出すコードを書きます。

from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path

urlpatterns = [
   path('login/', LoginView.as_view(
        redirect_authenticated_user=True,
        template_name='accounts/login.html',
    ), name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),
]

ログインページのテンプレートに、以下のフォーム呼び出しを書きます。

    <form method="post">
        {% csrf_token %}
        {% bootstrap_form form %}
        {% bootstrap_button button_type="submit" content="ログイン" %}
    </form>

プロジェクトのsettings.pyにログインの際のリダイレクト設定を入れます。

LOGIN_URL = '/accounts/login/'
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/'

プロジェクトのurls.pyに、認証用アプリを呼び出す設定を入れます。

urlpatterns = [
    ...

    path('accounts/', include('accounts.urls')),
]

認証を使用する側のアプリでは、ログイン、ログアウトへのリンクをタスクバーなどに追記します。

        <ul>
            {% if user.is_authenticated %}
            <li><a href="{% url 'logout' %}">ログアウト</a></li>
            {% else %}
            <li><a href="{% url 'login' %}">ログイン</a></li>
            {% endif %}
        </ul>

ログインが必要なページに遷移する際には、該当のビュー関数に@login_required デコレータをつけると、ログイン認証の判定が走り、未認証の場合は強制的にログインページに遷移されます。

@login_required
def hoge_view(request):
    ...

認証用クラスベースビューを使った基本的なログイン機能の実装は以上です。

実践Django Pythonによる本格Webアプリケーション開発 では 「第1章 コードスニペット共有サイトの開発」 でユーザー登録画面の実装方法も記載されており、「第7章 認証・認可」には、認証機能のカスタマイズ方法や注意事項がいろいろ紹介されています。

その2:django-allauthをつかう

2つ目は、Djangoの認証機能を提供するパッケージ django-allauth を使った実装です。
動かして学ぶ! Python Django開発入門 の「Chapter 10 Djangoに認証機能を追加する」では、この方法で実装されています。
django-allauthの公式ドキュメントはこちらです。

django-allauthを使った実装方法

こちらは更にシンプルです。

まず、django-allauth をインストールします。

pip install django-allauth

プロジェクトのsettings.pyに、 allauthを呼び出すための設定を入れます。
「’django.contrib.sites’」 、「SITE_ID = 1」は、django-allauthが内部で利用するためのおまじないです。

INSTALLED_APPS = [
    ...

    'django.contrib.sites',
    'allauth',
    'allauth.account',
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

SITE_ID = 1

プロジェクトのurls.pyに、 allauthを呼び出すための設定を入れます。
認証用アプリはaccountsというアプリ名ですが、allauthのデフォルトurls.pyに遷移するため、includeに渡すurlに注意。

urlpatterns = [
    ...

    path('accounts/', include('allauth.urls')),
]

django-allauth の使用するデータベースのテーブルを作成するため、マイグレーションを行います。

python manage.py migrate

認証を使用する側のアプリでは、ログイン、ログアウトへのリンクをタスクバーなどに追記します。

        <ul>
            {% if user.is_authenticated %}
            <li><a href="{% url 'logout' %}">ログアウト</a></li>
            {% else %}
            <li><a href="{% url 'login' %}">ログイン</a></li>
            {% endif %}
        </ul>

ログインが必要なページに遷移する際には、該当のビュークラスにLoginRequiredMixinをつけると、ログイン認証の判定が走り、未認証の場合は強制的にログインページに遷移されます。

@lass HogeView(LoginRequiredMixin, generic.View):
    ...

django-allauthを使った基本的なログイン機能の実装は以上です。

動かして学ぶ! Python Django開発入門 の「Chapter 10 Djangoに認証機能を追加する」では、他にもログイン画面のカスタマイズや、eメールを使った認証の実装なども記載されています。