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値が取得できないのでエラーになります。
うまい解決方法が見つかったら、別の記事に書きたいと思います。