utamaro’s blog

誰かの役に立つ情報を発信するブログ

Djangoでログイン後に特定の処理を挟む方法

表題の通りですが、Djangoでログイン後に一回だけ処理を入れたいときの方法を考えて見ました。

一つしか思いつかなかったのですが、紹介したいと思います。

やることをは簡単で、ログイン後のリダイレクトに一つだけviewを挟む形です。

まずは、settings.pyに以下の項目を追加します。

LOGIN_REDIRECT_URL = 'before-home'

これを追加すると、ログイン後にbefore-homeにリダイレクトされます。

before-homeというのはurls.pyにnameで設定した名前を入れます。

次にview.pyを修正します。

class GoToHomeView(RedirectView):
    pattern_name = 'home'

    def get_redirect_url(self, *args, **kwargs):
        request = self.request
        if request.user.is_authenticated:
            # ログインしている場合は、なにか処理する
            # is_authenticatedを入れなくても良いですが、ログインしてるとは限らない
            self.execute(request.user)
        return super().get_redirect_url(*args, **kwargs)

    def execute(self, user):
        # なにか処理

RedirectViewについては説明は↓に記載されています。

https://docs.djangoproject.com/ja/2.1/ref/class-based-views/base/#redirectview

コードの例では、pattern_nameにhomeを指定していて、リダイレクトするとhomeが呼ばれます。

get_redirect_urlをオーバーライドしており、ログイン後に処理が実行されるようになります。

if request.user.is_authenticated:でセーフコードを入れる理由としては、ログインしなくてもbefore-homeが実行される可能性があるからです。

@require_loginを入れても同じことができると考えたのですが、以下のコードでつまづきました。

    def decorator(view_func):
        @wraps(view_func)
        def _wrapped_view(request, *args, **kwargs):
            if test_func(request.user):

このコードはfrom django.contrib.auth.decorators内のコードで、login_requiredが実行されたときに呼ばれます。

その際にRedirectViewではuser値が取得できないのでエラーになります。

f:id:miyaji-y26:20181023080759p:plain

エラーの内容

うまい解決方法が見つかったら、別の記事に書きたいと思います。