Djangoでログインしているユーザーにのみ閲覧可能にしたいときに、login_requiredデコレータを使ったり、LoginRequiredMixinクラスを継承したりとやり方はいろいろあります。
しかし、ほとんどすべてのページでログイン制限かけたい場合は毎回views.pyに書くのはめんどくさいですよね。
ミドルウェアにログインチェックを自作するか、「GlobalLoginRequiredMiddleware」というモジュールを利用すれば簡単に一括でログイン必須にできますので、それぞれ説明していきます。
ミドルウェアを自作する方法
今回紹介する方法はどっちも簡単に実装できますので、お好みで構いませんが、私個人的にはミドルウェアの方が最小の機能だけで済みますので好きです。
ただ、ログイン必須じゃないページが多いとif文の条件が長くなってしまうのが難点ですね。
手順1:settings.pyと同階層にmiddlewareフォルダを作成
settings.pyがある階層にmiddlewareフォルダを作成します。
手順2:middlewareフォルダ内にlogin_required.pyを作成
login_required.py中身はこんな感じです。
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
class LoginRequiredMiddleware(MiddlewareMixin):
def process_response(self, request, response):
if request.user.is_anonymous: # 未ログインの処理
if (request.path == '/') or ('/logout' in request.path) or ('/login' in request.path) : # ログインしなくても閲覧可能なページ
return response
else: # 上記ページ以外に未ログインユーザーがアクセスして来たらトップページにリダイレクト
return redirect('/')
return response
手順3:settings.pyにミドルウェア追加
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'プロジェクト名.middleware.login_required.LoginRequiredMiddleware' # ←これを追加
]
以上で設定は終わりです。
ログインしていない状態でアクセスしてみてきちんとトップページにリダイレクトされていることを確認してみてください。
「GlobalLoginRequiredMiddleware」を利用する方法
手順1:インストール
$ pip install django-glrm
手順2:settings.pyにミドルウェア追加
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'global_login_required.GlobalLoginRequiredMiddleware', # ←これを追加
]
手順3:公開したいページの設定
Views単位で公開する場合
PUBLIC_VIEWS = [
'django.contrib.auth.views.login',
'myapp.views.the_view',
]
パスを指定して公開する場合
PUBLIC_PATHS = [
'^%s.*' % MEDIA_URL, # 画像ファイルなどなど
r'^/accounts/.*', # アカウント関係
]
上記のものは例なので、要件に合わせて変更してください。
記述場所はsettings.pyです。
views.pyでも設定できますので、気になる方は公式ドキュメントを読んでみてください。
コメント