ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Using the Django authentication system
    Project using python/Cloning Airbnb 2021. 3. 2. 13:42

    login_required decorator

    config/settings.py

    LOGIN_URL = "/users/login/"

    users/views.py

      @login_required는 user가 로그인을 했을 때만 밑에 있는 function이 실행되게끔 한다. 만약 로그인된 상태가 아니라면 config/settings.py에 정의된 LOGIN_URL로 user를 redirect한다.

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def log_out(request):
        if request.user.is_authenticated:
            logout(request)
            return redirect(reverse("core:home"))
        else:
            return redirect(reverse("users:login"))

    UserPassesTestMixin

     

    users/mixins.py

      UserPassesTestMixin은 test_func()을 이용해서 test_func이 true를 반환하면 UserPassesTestMixin를 상속하는 class는 그대로 code를 실행하고 false를 반환하면 handle_no_permission()을 실행한다.

      handle_no_permission은 권한이 없는 경우 redirect를 하는 함수다. 즉, LoggedOutOnlyView는 login을 하지 않았을 때에 사용자에게 서비스를 제공한다.

    from django.contrib.auth.mixins import UserPassesTestMixin
    
    class LoggedOutOnlyView(UserPassesTestMixin):
    
        permission_denied_message = "Page Not Found"
    
        def test_func(self):
            return not self.request.user.is_authenticated
            
        def handle_no_permission(self):
            return redirect(reverse("core:home"))
    

    users/views.py

     

      SingnUpView가 mixins.LoggedOutOnlyView을 상속했다. LoggedOutOnlyView는 user가 logout인 경우에만 sign up page에 접속할 수 있게 한다.

    from . import forms, mixins
    
    class SignUpView(mixins.LoggedOutOnlyView, FormView):
    
        """ Sign Up View """
    
        form_class = forms.SignUpForm
        success_url = reverse_lazy("core:home")
        template_name = "pages/users/signup.html"
    
        def form_valid(self, form):
            try:
                form.save()
                email = form.cleaned_data.get("email")
                password = form.cleaned_data.get("password")
                authenticate(self.request, username=email, password=password)
                return super().form_valid(form)
            except IntegrityError as error:
                print(error)
                return redirect(reverse("users:signup"))

    LoginRequiredMixin

    users/mixins.py

      LoginRequiredMixin은 사용자가 login을 했을 경우에만 서비스를 제공한다. 그렇지 않은 경우 login_url에 정의된 url로 redirect된다.

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class LoginOnlyView(LoginRequiredMixin):
        login_url = reverse_lazy("users:login")
    

     

    참고 자료

    소스 코드

    github.com/zpskek/airbnb-clone-v3/commit/64a21a423b0c65ffabbd4e02277faede7dede0f2

    'Project using python > Cloning Airbnb' 카테고리의 다른 글

    django github login  (0) 2021.03.03
    django messages framework  (0) 2021.03.02
    django logout  (0) 2021.03.02
    django Login CBV  (0) 2021.03.02
    django login FBV using forms.py  (0) 2021.03.02

    댓글

Designed by Tistory.