BLOG
Python

Django-allauth Login, Logout 시 Redirect 설정하기


Oct. 16, 2021, 5:15 p.m.



성공적으로 Django에 allauth를 설치했다면 쉽게 이메일 로그인, 소셜 로그인등을 구현할 수 있습니다.

만약에 블로그나 쇼핑몰 같은 사이트에서 로그인을 진행한다면 어디로 Redirect 가 진행되어야 할까요?

블로그라면 블로그 메인화면이라던가, 쇼핑몰이면 내 장바구니 등으로 Redirect가 진행되면 편리할 것입니다.

이번 포스트에서는 allauth를 사용해 로그인, 로그아웃등을 진행 할 때 Redirect를 커스텀 하는 방법을 알아보도록 하겠습니다.


1. 고정적인 Redirect 설정하기


어떤 페이지에서 로그인, 로그아웃을 진행하든 항상 같은 페이지로 Redirect가 진행되게 하고 싶다면 아주 간단한 설정 만으로도 가능합니다. 바로 settings.py에서 변수를 하나 추가해주기만 하면 됩니다.

settings.py 에 들어가서 아래와 같이 변수를 추가해줍니다.

-settings.py-

...
LOGIN_REDIRECT_URL = '/blog/'

그러면 이제부터 로그인을 진행했을 때 무조건 '/blog/'로 Redirect가 진행됩니다.

그런데 만약 상황에 따라 Redirect가 다르게 진행되어야 한다면 어떨까요? 예를 들어 블로그에서 어떤 글을 보고 있다가 로그인을 진행했다면 다시 그 글로 돌아가야 편리할 것입니다.


2. 동적으로 Redirect 진행하기


그럴 때는 allauth에서 이미 구현해 놓은 기능을 잘 활용하기만 하면 됩니다. 저도 처음에는 이러한 기능이 구현되어 있는지 모르고 제가 직접 구현하려고 했었는데요, allauth의 코드를 뒤지다가 이미 구현이 되어 있다는 것을 깨달았습니다.

allauth의 login.html 을 보면 redirect 관련한 hidden input을 볼 수 있습니다.

<form class="login" method="POST" action="{% url 'account_login' %}">
            {% csrf_token %}
            {{ form.as_p }}
            {% if redirect_field_value %}
            <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" />
            {% endif %}
            <button class="primaryAction" type="submit">Log In</button>
</form>

즉 로그인 버튼을 눌렀을 때 POST로 넘어가는 값 중에 로그인이 완료 된 후 redirect 되는 링크를 넘기면 무엇인가 벌어진다는 것입니다. 그래서 allauth에서 login 관련된 코드를 살펴본 결과, '/accounts/login/'으로 진입할 때 next라는 이름을 가진 쿼리 값으로 redirect 링크를 넘기면 앞서 본 hidden input에 링크가 전달되고 이것이 로그인 버튼을 누르면 그대로 POST로 전달되어 로그인이 완료된 후 그 링크로 가는 것을 확인했습니다. 로그아웃도 마찬가지이고요.

즉, /accounts/login/?next=link link에 redirect 하고 싶은 링크를 넣으면 됩니다.

그렇다면 만약에 로그인 후 로그인 바로 직전 사이트로 다시 돌아오게 하려면 어떻게 하면 될까요?

저는 자바스크립트를 활용하여 현재 사이트 주소를 불러와 쿼리문으로 넘겨주는 식으로 구현했습니다.

function Login() {    
      var link = window.location.href;
      var list = link.split('/');
      list.splice(0,3);
      var redir = '/'.concat(list.join('/'));
      location.href = "/accounts/login/?next="+redir;
 }

이런식으로 만약 사이트에서 로그인 버튼을 눌렀을 때 저 함수를 실행하게 된다면 현재 링크를 받아와서 /로 split 한 다음 루트 디렉터리를 제외한 링크만 살려서 '/accounts/login/'에 쿼리값을 붙여서 이동하면 됩니다.

참고로 html에서 버튼을 눌렀을 때 javascript의 특정 함수를 실행하게 하고 싶다면 아래와 같이 하면 됩니다.

<a id="loginurl" class="nav-link text-light" href="javascript:Login()">Log In</a>

그럼 이제 원하는 대로 로그인, 로그아웃 후 Redirect를 구현할 수 있습니다!

allauth Django



Search