Django에서는 view endpoint를 로그인 유저에게만 허용되도록 @login_required
데코레이터를 통해 간편하게 적용할 수 있다.
@login_required
데코레이터는 어떻게 동작할까?
root endpoint (http://localhost:8000/) view에 @login_required
를 적용한다고 해보자.
이 경우, http://localhost:8000/ 은 로그인 하지 않은 상태에서는,
@login_reqired
에 의해 http://localhost:8000/accounts/login/?next=/ 으로 리다이렉트 된다.
난 로그인에 대한 그 어떤것도 작성하지 않았음에도, @login_required
를 적용하면 /account/login/?next=/ 로 자동으로 페이지가 이동하는 것이다.
이유가 뭘까?
먼저, @login_required
는 settings.py
에 정의된 LOGIN_URL
값을 참조하여 url을 생성하여 해당 url로 이동하게 된다.
django.conf.global_settings.py
를 보면, 다음과 같이 Default LOGIN_URL
이 정의되어 있다.
LOGIN_URL = "/accounts/login/"
따라서, login url에 대한 어떤 사용자 정의가 없어도, 해당 url(http://localhost:8000/accounts/login/)로 이동하는 것이다.
그렇다면, ?next=/ 쿼리 스트링은 무엇인가?
해당 엔드포인트가 @login_required
로 인해, 로그인 하지 않은 상태에서는, login 페이지로 자동으로 이동하게 된다.
로그인에 성공할 경우, 원래 접근하고자 했던 endpoint(http://localhost:8000/)로 다시 돌아갈 수 있어야 하는 것이 타당할 것이다.
이를 위해 next 라는 쿼리스트링을 자동으로 추가하여,로그인 후 처음에 접근하고자 했던 엔드포인트로 돌아가도록 만드는 것이다.
예를 들어,
http://localhost/aaa/ 엔드포인트가 @login_required
로 보호된다고 해보자.
이 경우 엔드포인트 접근 시, 자동으로 http://localhost/accounts/login/?next=/aaa 로 리다이렉트 되며,
해당 로그인 페이지에서 로그인이 성공할 경우, next=/aaa 쿼리스트링을 통해 다시 http://localhost/aaa 로 리다이렉트 되는 것이다.
Class Based View인 LoginView
또한 내부적으로 url의 next 쿼리스트링으로 로그인 성공시 이동하는 페이지를 제어가능하다.
next 쿼리스트링이 존재하지 않을 경우, django.conf.global_settings.py
에 정의 된
LOGIN_REDIRECT_URL = "/accounts/profile/"
로 이동하나,
url에 next 쿼리스트링이 존재할 경우, 이것이 우선한다.
즉, next 쿼리스트링을 통해 로그인 후 이동할 페이지에 대해 사용자 제어 가능하다는 것이다.
LoginView
를 사용할 경우, next는 템플릿 변수로 템플릿에 전달되며, html에서 {{next}}를 통해 사용 가능하다.
로그인 폼 html 페이지에서,
<input type="hidden" name="next" value="이동하고자 하는 위치" />
를 추가할 경우, 로그폼과 함께, next 변수는 '이동하고자 하는 위치'로 전달되며, ListView
는 next 변수 대로, 이동하도록 할 수 있다.
즉, 로그인 후, http://localhost/이동하고자-하는-위치 로 리다이렉트 시킬 수 있는 것이다.
나는 처음에 Django 에서 next 변수를 왜 사용하는지 잘 이해가 되지 않았다.
이제는 좀 알것같다. 그리고 이것을 통해 보다 유용하게 Django를 사용할 수 있을것 같다.
Django에서의 규칙이 존재할 경우, 이를 잘 활용할 수 있으며 적극적으로 이용해야 한다고 생각한다.
@login_required
를 정리해 보자면,
settings.py
에 정의된 LOGIN_URL
로 이동. (login page의 url 에는 로그인 성공 시 원래 페이지로 돌아가기 위한 next 쿼리스트링이 존재.)settings.py
의 LOGIN_REDIRECT_URL
과 next 쿼리스트링 중 next 가 우선.