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