- Djangoでデコレーターを自作するには?
- デコレーターをカスタマイズしてログイン機能などのアクセス制限を加えるには?
本記事ではこのような疑問を解決します。
Djangoでログイン認証条件やアクセス制限条件を自由にカスタマイズしたい時ってありませんか?
例えばユーザーの種類ごとにアクセスできるページを変更したい時など。
このようなDjangoでの認証問題はデコレーターを自作すればほぼ解決できます。
そこで今回はログイン機能を例にDjangoでの自作デコレーターをご紹介します。
Djangoでのデコレーターの仕組み
Djangoでのデコレーターは主に以下のように使われます。
関数(views.py)を実行するための条件を指定する
→例)ログイン機能、アクセス制限機能
簡単にいうと、「デコレーターの処理内容に合格したら関数(views.py)を実行していいよ!」という仕組みです。
そして、その最たる例がログイン機能でしょう。
Djangoではデフォルトでlogin_requiredデコレーターが用意されていますが、
複数種類ごとのユーザー認証ができない等カスタマイズ性に欠けるため、何かと不便です。
そこでデコレーターを自作することでログインするための様々な条件を加えることができるため、
それぞれのWebアプリに合ったログイン機能を実装することができます。
コピペOKの自作デコレーター
それでは実際の自作デコレーターをご紹介します。
こちらのデコレーターは「お店のスタッフのみログインできる」という処理内容です。
※「カスタマイズ部分」を自由に変えてください。
from django.shortcuts import redirect
from .models import StoreUser# StoreUserはお店スタッフを表すテーブル→certificationフィールドは認証情報を表す
def login_required_store(func):# カスタマイズ部分(関数名)
"""お店スタッフのログイン認証
"""
def checker(request, *args, **kwargs):
if not request.user.is_authenticated:# カスタマイズ部分(ここから)
return redirect('store_login')# store_loginはお店ログインページを表す
else:
if StoreUser.objects.get(certification=request.user):
return func(request, *args, **kwargs)
else:
return redirect('store_login')# カスタマイズ部分(ここまで)
return checker
こちらのデコレーターをコピペしてif文の条件や処理内容をカスタマイズすれば、いくらでも応用が利きます。
ちなみに、上記のデコレーターを使うにはviews.pyで以下のようにdecorators.pyをインポートする必要があります。
from .decorators import login_required_store
@login_required_store
# def 関数名():
# 処理内容
まとめ
以上が様々なログイン機能に応用できる自作デコレーターになります。
上記デコレーターを使えば、Djangoデフォルトのlogin_requiredデコレーターは不要になるでしょう。
また、本記事の自作デコレーターを応用すれば、特定のユーザーのアクセス制限をすることも可能です。
ぜひいろいろな形で試してみてください。