プログラミング

[Django]login_requiredデコレータをカスタマイズする

プログラミング
この記事は約3分で読めます。
スポンサーリンク

Djangoの「login_required」デコレータのカスタマイズ方法を説明していきたいと思います。

まず、「login_required」デコレータ自体がどのように実装されているかというと、

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    """
    Decorator for views that checks that the user is logged in, redirecting
    to the log-in page if necessary.
    """
    actual_decorator = user_passes_test(
        lambda u: u.is_authenticated,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

こんな感じで、「is_authenticated」であるユーザの場合、function(まぁ、大体はView)を実行する仕組みになっています。

システムによっては、ログインするユーザの役割などによってアクセスさせたい画面を分けたい場合があり、「is_authenticated」かつ「ユーザの役割」とすることで、特定の役割を持ったユーザのみ画面にアクセスできるようにデコレータを作成したいと思います。

パーミッションで分けるやり方もありだとは思いますが、あれだと画面自体は表示されてしまうので、今回のように画面へのアクセス自体を制御したい場合はデコレータをカスタムする方が良い気がします。

スポンサーリンク

login_requiredカスタマイズ

Djangoのプロジェクト内に「decorators.py」というファイルを作成します。

作成したファイルに以下のようにデコレータを実装していきます。

from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test


def custom_login_required(view_func=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    actual_decorator = user_passes_test(
        # is_authenticatedかつrole_aのユーザのみ許可する
        lambda u: u.is_authenticated and u.role_a,
        login_url=login_url,
        redirect_field_name=redirect_field_name
    )
    if view_func:
        return actual_decorator(view_func)
    return actual_decorator

これで後は「urls.py」で「login_required」デコレータを使用するのと同じように「custom_login_required」を使用すれば、カスタムされたデコレータを使用することができます。

最後に

フレームワークが提供する便利な機能も、場合によっては自分でカスタムした方がより使い勝手がよくなることがあります。ただ、カスタムするためにはそのフレームワーク自体の理解も深めていかないと、意図しない動作を引き起こさせたり、車輪の再開発になることもあるので、その点には注意が必要だと思います。

スポンサーリンク
スポンサーリンク
KoEをフォローする
CodeLab

コメント

タイトルとURLをコピーしました