[django] 로그인한 사용자가 signup 페이지에 접근했을때 redirect하기

itisny·2023년 11월 7일
0
post-custom-banner

요구사항

로그인한 사용자가 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 함수가 제가 의도한 것에 맞지 않는걸까하면서 구글링해봤지만 명쾌한 답이 나오지 않았습니다..

그래서 강사님께 아래와 비슷하게 상황을 설명한 후 해결방법을 논의했습니다.

  • 의도 : 로그인한 사용자가 signup 페이지(/accounts/signup)에 접근했을때 index로 redirect하기를 원합니다.
  • 상황 : UserPassesTestMixin를 사용해서 403 forbidden 화면이 나오는 것을 확인했습니다. handle_no_permission를 추가하면 redirect을 할 수 있다는 것을 알게되어 코드를 추가했습니다. 그랬더니 AttributeError: 'proxy' object has no attribute 'get' 에러가 발생합니다.
  • 해결 : reverse_lazy말고 redirect한번 써보시겠어요?

[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 함수의 동작 방식에 차이가 있기 때문

  • reverse_lazy: reverse_lazy 함수는 URL 패턴 이름을 가져와서 해당 패턴의 URL을 생성하지만, URL을 생성만 하고 실제로 사용자를 리다이렉트하지는 않습니다. 따라서 reverse_lazy를 사용하면 URL을 생성할 뿐이며, 이 URL을 어딘가에서 사용해야 실제로 리다이렉트됩니다.
  • redirect: redirect 함수는 사용자를 지정한 URL로 즉시 리다이렉트합니다. URL을 지정하고 함수를 호출하면 사용자는 해당 URL로 리디렉션됩니다.

참고:
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

post-custom-banner

0개의 댓글