2021.12.20 - [Study/Django] - [Django] 장고 유저 기능 구현하기 #10 (이메일 인증 기능)
[Django] 장고 유저 기능 구현하기 #10 (이메일 인증 기능)
2021.12.19 - [Study/Django] - [Django] 장고 유저 기능 구현하기 #9 ( 회원가입 정보 유효성 검사) [Django] 장고 유저 기능 구현하기 #9 ( 회원가입 정보 유효성 검사) 2021.12.18 - [Study/Django] - [Django]..
programmers-sosin.tistory.com
이번 게시글에서는 유저가 비밀번호를 찾거나, 변경하는 것을 직접 만들어보겠습니다.
비밀번호 찾기
Django의 allauth는 기본적으로 비밀번호 찾기 기능을 제공해주고 있습니다.
로그인 페이지에서 비밀번호 찾기를 누르면 위와 같은 화면이 나오고, 이메일을 입력하면 비밀번호를 초기화할 수 있는 링크가 담긴 이메일이 오게 됩니다.
이때 이메일에는 위 사진 처럼 비밀번호를 초기화할 수 있는 URL을 주는데요.
이 url의 유효기간을 정해줄 수 있습니다. defualt 값은 3일입니다.
settings.py에 PASSWORD_RESET_TIMOUT = ( 단위 : 초 )로 설정해줄 수 있습니다.
이번엔 비밀번호 초기화가 아닌 비밀번호 변경을 위해 로그인 후 메인 페이지에서 비밀번호 변경을 추가해보겠습니다.
{# index.html #}
<nav>
{% if user.is_authenticated %}
<a href="{% url 'account_logout' %}">로그아웃</a>
{% else %}
<a href="{% url 'account_login' %}">로그인</a>
<a href="{% url 'account_signup' %}">회원가입</a>
{% endif %}
</nav>
<h1>홈페이지</h1>
{% if user.is_authenticated %}
<p>안녕하세요!{{ user }}님!</p>
<p>{{ user }}님의 닉네임은 {{ user.nickname }} 입니다!</p>
<p><a href={% url 'account_change_password' %}>비밀번호 변경</a></p>
{% else %}
<p>로그아웃된 상태입니다!</p>
{% endif %}
위처럼 메인 페이지인 index.html에
<p><a href={% url 'account_change_password' %}>비밀번호 변경</a></p>
아래와 같은 코드를 추가해줍니다. 이때 url에 적혀있는 account_change_password url이 allauth에서 제공하는 비밀번호를 변경해주는 url입니다.
그럼 메인 페이지에 비밀번호 변경이 생기고, 그걸 클릭하면 아래 사진과 같이 비밀번호를 변경할 수 있게 됩니다.
위처럼 비밀번호를 변경한 후 페이지가 이동되는 것이 아닌 기존 페이지에서 메시지만 추가되는데요.
이때 위처럼 똑같은 페이지로 이동되는 것은 설정만으로는 할 수 없기 때문에 allauth의 PasswordChangeView를 상속받아 오버 라이딩해줘야 합니다.
# views.py
from django.shortcuts import render
from django.urls import reverse
from allauth.account.views import PasswordChangeView
def index(request):
print(request.user.is_authenticated)
return render(request, 'coplate/index.html')
class CustomPasswordChangeView(PasswordChangeView):
def get_success_url(self): # 어떠한 폼이 성공적으로 처리되면 어디로 리디렉션 될지 정해주는 함수
return reverse("index")
위처럼 allauth의 PasswordChangeView를 import 하고 오버 라이딩하기 위해 class를 선언하고 상속받습니다.
이때, 패스워드가 성공적으로 처리됐을 때만 작동하는 함수인 get_success_url 함수를 사용해서 페이지를 리디렉션 합니다.
reverse 함수는 urls.py 에 선언해둔 name에 따라 URL을 받아와서 사용할 수 있게 해주는 기능을 가지고 있습니다.
그 후 이제 프로젝트 폴더의 urls.py에 url을 추가해줘야 합니다.
# 프로젝트폴더/urls.py
from django.contrib import admin
from django.urls import path, include
from django.views.generic import TemplateView
from coplate.views import CustomPasswordChangeView
urlpatterns = [
# admin
path('admin/', admin.site.urls),
# coplate
path('', include('coplate.urls')),
# allauth
path("email-confirmation-done/",
TemplateView.as_view(template_name="coplate/email-confirmation-done.html"),
name="account_email_confirmation_done"),
path('password/change/', CustomPasswordChangeView.as_view(), name="account_change_password"),
path('', include('allauth.urls')),
]
from coplate.views import CustomPasswordChangeView
path('password/change/', CustomPasswordChangeView.as_view(), name="account_password_change"),
이 두 부분을 추가해준 것인데요.
작성한 class를 import 한 후, url을 추가해준 것입니다.
이때, allauth.urls 보다 위에 설정해주어야 url이 설정해놓은 url을 찾을 때, allauth의 password/change url이 아닌 자신이 작성한 페이지로 이동시킬 수 있습니다.
'Study > Django' 카테고리의 다른 글
[Django] 장고 유저 기능 구현하기 #12 ( Form에 디자인 입히기) (0) | 2021.12.26 |
---|---|
[Django] allauth URL 및 세팅 (0) | 2021.12.22 |
[Django] 장고 유저 기능 구현하기 #10 (이메일 인증 기능) (0) | 2021.12.20 |
[Django] 장고 유저 기능 구현하기 #9 ( 회원가입 정보 유효성 검사) (0) | 2021.12.19 |
[Django] 장고 유저 기능 구현하기 #8 (닉네임 필드 추가하기) (0) | 2021.12.18 |