-
Using the Django authentication systemProject 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")
참고 자료
- 노마드 코더의 Airbnb 클론 강의
- @login_required
- UserPassesTestMixin
- LoginRequiredMixin
소스 코드
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