Project using python/Cloning Airbnb

Using the Django authentication system

Cog Factory 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