Использование Django UserPassesTestMixin с LoginRequiredMixin для перехода на авторизованный URL - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь написать миксин, который будет защищать представления, сначала проверяя, вошел ли кто-то в систему, а затем, если они были на борту. Кажется, это работает, блокируя представления, к которым он прикреплен, но URL-адрес просто переходит к 403 запрещенным. Любые идеи о том, как заставить его перейти на указанный URL-адрес?

from django.contrib.auth.mixins import UserPassesTestMixin
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
from django.contrib.auth.mixins import LoginRequiredMixin


class OnboardedMixin(LoginRequiredMixin, UserPassesTestMixin):
    """
    a custom mixin that checks to see if the user has been onboarded yet
    """

    def test_func(self):
        if self.request.user.onboarded and self.request.user.is_active:
            return True

    def get_login_url(self):
        return redirect('onboarding',)

1 Ответ

0 голосов
/ 11 ноября 2018

Вместо того, чтобы использовать этот подход, возможно, лучше использовать декоратор. Например:

from django.contrib.auth.decorators import login_required

def my_login_required(function):
    def wrapper(obj, request, *args, **kw):
        decorated_view_func = login_required(request)
        if not decorated_view_func.user.is_authenticated:
            return decorated_view_func(request)  # restricts without login and sends to signin view

        if request.user.onboarded and request.user.is_active:
               return function(obj, request, *args, **kw)
        return HttpResponseRedirect("/onboarding/")

    return wrapper

И используйте этот декоратор в желаемых видах:

 class SomeView(DetailView):
    ...

    @my_login_requried
    def dispatch(self, *args, **kwargs):
         return super(SomeView, self).dispatch(*args, **kwargs)
...