Djangoでログイン必須サイトにする方法

はじめに

Django ですべてのページにおいてログインをしていなければログインページにリダイレクトする方法を紹介します。

標準ではデコレータを使用する

公式ドキュメントによれば、ビュー層のデコレーターを使用すれば実装が可能です。
Djangoの認証システムを使用する | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/topics/auth/default/#the-login-required-decorator
from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    # ...
しかし、これをすべてのビューに実装するのは手間ですし、1 ページでも実装を忘れてしまったら大変なことになります。

ミドルウェアの追加

下記を参考に、ミドルウェア(プラグインのようなもの)を追加し、対処します。リクエストを受けた段階でログイン済みか判定し、ログインしていなければリダイレクトするミドルウェアを追加します。
ミドルウェア (Middleware) | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/topics/http/middleware/
例えば /app/middleware/auth.py にミドルウェアの Python ファイルを作成します。リダイレクトループを防ぐため、ログインの URL/login/ にアクセスされた場合はログインしていない場合もリダイレクトしません。
from django.http import HttpResponseRedirect
from django.utils.deprecation import MiddlewareMixin

class authMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if not request.user.is_authenticated and request.path != '/login/':
            return HttpResponseRedirect('/login/')
        return response

setting.py を編集

setting.pyMIDDLEWARE 変数に今回追加したミドルウェアを追加します。
MIDDLEWARE = [
    'app.middleware.auth.authMiddleware',
]

動作の様子

ログインしていなければ下記のとおりログイン画面にリダイレクトされます。
HTTP レスポンスヘッダーに /login/ へのリダイレクトが含まれている

ホームプロフィール外部リンクのため、別ウインドウで開きますプライバシーポリシー

© 2023 Oishi Takanori / Made with Gatsby.js