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")
참고 자료
- 노마드 코더의 Airbnb 클론 강의
- @login_required
- UserPassesTestMixin
- LoginRequiredMixin
소스 코드
github.com/zpskek/airbnb-clone-v3/commit/64a21a423b0c65ffabbd4e02277faede7dede0f2