自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】未認証ユーザーをログインページにリダイレクトする【LoginRequiredMixinもしくは@login_required】

thumbnail

ログインしていないユーザーが特定のページにアクセスしてきた時、処理を実行せず、ログインページにリダイレクトするには、LoginRequiredMixinを使う。

前提

予め前もって、認証を実装しておく。allauthを使っても、Djangoの備え付けの認証を使っても良い。

クラスベースのビューであればLoginRequiredMixinを多重継承する。

from django.shortcuts import render
from django.views import View

from django.contrib.auth.mixins import LoginRequiredMixin

class IndexView(LoginRequiredMixin,View):

    def get(self, request, *args, **kwargs):
        return render(request,"bbs/index.html")

index   = IndexView.as_view()

参照: https://docs.djangoproject.com/en/4.0/topics/auth/default/

関数ベースのビューの場合は、デコレータの@login_requiredを使う

関数ベースのビューの場合はデコレータの@login_requiredを使う。

from django.shortcuts import render
from django.views import View

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')    
def index(request):
    return render(request,"bbs/index.html")

参照: https://docs.djangoproject.com/en/4.0/topics/auth/default/#the-login-required-decorator

デコレータとは、ざっくり言ってしまえば関数に機能を追加することを意味する。

例えば、Djangoであればカスタムテンプレートタグがある。ただの関数ではテンプレートタグとして機能することはできないため、@register.simple_tag()をデコレータとしてセットする

Djangoでページネーションを実装する方法【django.core.paginator】【パラメータ両立】

結論

これでLoginRequiredMixinが多重継承されたクラスベースのビュー、もしくは@login_requiredデコレータが搭載されたビュー関数が実行された時、認証状態をチェックして、未認証状態であればログインページへリダイレクトする。

【補足1】GETは未認証OKで、POSTメソッドは未認証NGにしたい場合はどうする?

閲覧はOKで、投稿は禁止というサイトを作りたい場合もあるだろう。動画投稿サイトやSNSなどがそうだ。

その場合、今回のビュー全体に対して認証状態の可否をチェックし、リダイレクトする方式は通用しない。そこで、各メソッドの冒頭で、認証状態をチェックする条件分岐を追加すると良いだろう。

class IndexView(View):

    def get(self, request, *args, **kwargs):

        return render(request,"bbs/index.html")

    def post(self, request, *args, **kwargs):
        # TODO:ここで認証状態をチェックする。


        if request.user.is_authenticated:
            print("認証済み")
        else:
            print("未認証")


        return redirect("bbs:index")

index   = IndexView.as_view()

requestオブジェクトのuser(ユーザーモデル)の中には、.is_authenticated属性がある。これは認証済みであればTrueを未認証であればFalseを返す。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ