スポンサーリンク

【Django】超簡単に一括でログイン必須する方法

【Django】超簡単に一括でログイン必須する方法

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でも設定できますので、気になる方は公式ドキュメントを読んでみてください。

コメント