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',
]

動作の様子

ログインしていなければ下記のとおりログイン画面にリダイレクトされます。

@bicstone

大石貴則 (Ōishi Takanori) と申します。 Webエンジニア / セキュリティスペシャリスト / 機械エンジニア です。 プロダクトに幅広く携わり、相互成長し続けられるエンジニアを目指しています。

GitHubLinkedIn