Djangoですべてのページにおいてログインをしていなければログインページにリダイレクトする方法を紹介します。
標準ではデコレータを使用する
公式ドキュメントによれば、ビュー層のデコレーターを使用すれば実装が可能です。
Djangoの認証システムを使用する | Django ドキュメント | Django
from django.contrib.auth.decorators import login_required @login_required def my_view(request): 略
しかし、これをすべてのビューに実装するのは手間ですし、1ページでも実装を忘れてしまったら大変なことになります。
ミドルウェアの追加
下記を参考に、ミドルウェア(プラグインのようなもの)を追加し、対処します。リクエストを受けた段階でログイン済みか判定し、ログインしていなければリダイレクトするミドルウェアを追加します。
ミドルウェア (Middleware) | Django ドキュメント | Django
例えば /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.py
のMIDDLEWARE
変数に今回追加したミドルウェアを追加します。
MIDDLEWARE = [ 'app.middleware.auth.authMiddleware', ]
動作の様子
ログインしていなければ下記のとおりログイン画面にリダイレクトされます。
コメント