로그인한 사용자가 signup 페이지(/accounts/signup)에 접근했을때 index로 redirect하기를 원합니다
[1번째 시도]
class SignUpView(CreateView):
redirect_authenticated_user = True
form_class = SignUpForm
template_name = "accounts/signup.html"
success_url = settings.LOGIN_URL
redirect_authenticated_user = True를 사용해봤습니다.
하지만 페이지 접속이 됩니다. redirect_authenticated_user 속성은 django.contrib.auth 기반 뷰에서 사용이 가능하다는 것을 알았습니다.
[2번째 시도]
class SignUpView(UserPassesTestMixin, CreateView):
form_class = SignUpForm
template_name = "accounts/signup.html"
success_url = settings.LOGIN_URL
def test_func(self):
return self.request.user.is_anonymous
Mixin은 기존의 클래스에 어떤 기능을 더해줄 때 쓰입니다. 이번에는 UserPassesTestMixin을 활용해서 뷰 클래스에 접근 제어 기능을 더해줬습니다.
403 forbidden 화면이 나오는 것을 확인함으로써 HTTP 403 Forbidden 응답으로 액세스가 거부된 것을 확인했습니다.
하지만 index페이지로 redirect할 의도가 있어서 handle_no_permission를 추가하여 실행해봤습니다.
[3번째 시도]
class SignUpView(UserPassesTestMixin, CreateView):
form_class = SignUpForm
template_name = "accounts/signup.html"
success_url = settings.LOGIN_URL
def test_func(self):
return self.request.user.is_anonymous
def handle_no_permission(self):
return reverse_lazy("index")
AttributeError: 'proxy' object has no attribute 'get' 에러가 발생했네요..?
제가 활용한 handle_no_permission 함수가 제가 의도한 것에 맞지 않는걸까하면서 구글링해봤지만 명쾌한 답이 나오지 않았습니다..
그래서 강사님께 아래와 비슷하게 상황을 설명한 후 해결방법을 논의했습니다.
[4번째 시도]
from django.shortcuts import redirect
class SignUpView(UserPassesTestMixin, CreateView):
form_class = SignUpForm
template_name = "accounts/signup.html"
success_url = settings.LOGIN_URL
def test_func(self):
return self.request.user.is_anonymous
def handle_no_permission(self):
return redirect("index")
reverse_lazy말고 redirect를 썼는데, 로그인한 사용자가 signup 페이지(/accounts/signup)에 접근했을때 index로 redirect가 되었습니다.
원인 : reverse_lazy와 redirect 함수의 동작 방식에 차이가 있기 때문
참고:
1. https://docs.djangoproject.com/en/4.1/topics/auth/default/#the-loginrequired-mixin
2. https://corncream.tistory.com/entry/AccessMixin-%EC%A0%95%EB%A6%AC-%EB%85%B8%ED%8A%B8-1