코딩공부/Python Django

django password reset (1) - class PasswordReset 사용하기

integerJI 2020. 8. 21. 12:57

들어가기에 앞서

 

User 모델의 email 정보 추가

로그인, 회원가입을 진행하며 django의 User모델을 사용해 username과 password만 입력하여 간단한 로그인 기능을 만들었습니다.

하지만 패스워드 초기화 기능을 사용하기 위해 사용자의 email을 받아주어야 합니다.

 

views.py

def signup(request):
    if request.method == 'POST':
        username = request.POST['username']
        password1 = request.POST['password1']
        password2 = request.POST['password2']
        email = request.POST['email']

        if password1 == password2:
            if User.objects.filter(username=username).exists():
                messages.info(request, '이미 존재하는 회원입니다.')
                return render(request, 'signup.html')
            else:
                user = User.objects.create_user(username, password=password1, email=email)
                auth.login(request, user)
                return redirect('index')
        else:
            messages.info(request, '비밀번호가 일치하지 않습니다.')
            return render(request, 'signup.html')
        
    return render(request, 'signup.html')

 

 

기존의 소스에서 email을 받아 저장합니다.

 

signup.html

...생략

<div class="form-group">
	<label for="inputPassword" class="sr-only">Email</label>
	<input type="email" id="email" name="email" class="form-control"
		placeholder="email" required>
</div>
        
...생략

 

회원가입 페이지에서도 email input을 추가해 줍니다.

 

 

class PasswordReset 사용을 위한 설정

django에서 제공하는 PasswordReset url 설정

 

urls.py

# user/urls.py

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('signup/', views.signup, name='signup'),
    path('signin/', views.signin, name='signin'),
    path('signout/', views.signout, name='signout'),
    path('password_reset/', auth_views.PasswordResetView.as_view(), name="password_reset"),
    path('password_reset_done/', auth_views.PasswordResetDoneView.as_view(), name="password_reset_done"),
    path('password_reset_confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name="password_reset_confirm"),
    path('password_reset_complete/', auth_views.PasswordResetCompleteView.as_view(), name="password_reset_complete"),
]

 

from django.contrib.auth import views as auth_views

 

어떠한 app에서 사용해도 작동을 하며 django의 password_reset을 사용하기 위해 import 해줍니다.

 

path('password_reset ~~~ .. 생략), 부분을 입력해 줍니다.

 

 

서버 실행

http://127.0.0.1:8000/user/password_reset/

 

서버를 실행하여 urls.py에서 설정한 경로를 들어갑니다.

 

저는 user라는 app에서 설정해 주었기 때문에 /user/password_reset/로 들어갑니다.

 

 

django에서 제공하는 비밀번호 초기화 페이지로 진입합니다.

 

회원 가입할 때 넣어준 이메일 주소를 입력합니다.

 

현재 페이지에서의 문제점은 아무 email이나 입력해도 이메일 전송 성공 페이지로 넘어가게 됩니다.

 

해당 부분은 다음 게시물에서 진행합니다.

 

회원 가입할 때 입력한 email을 적어 "비밀번호 초기화" 버튼을 누르게 되면

 

 

새 비밀번호가 전송되었다는 문구와 함께 password_reset_done 페이지로 넘어갑니다.

 

이제 입력한 이메일에 메일이 도착해 있습니다.

 

  • 해당 작업은 모두 SMTP 설정 작업이 완료되어 있어야 합니다.

 

도착한 메일 확인

 

이메일을 확인해 보면 사이트 주소와 해당 이메일과 연결된 사용자 이름이 같이 출력됩니다.

 

이제 적혀있는 url로 이동을 하면 비밀번호 초기화 페이지로 넘어가게 됩니다.

 

비밀번호 초기화

 

해당 url에 이동하면 비밀번호 초기화 설정 창으로 이동합니다.

 

사이트에서 새로운 비밀번호를 누르면 사용자의 비밀번호가 새롭게 변하게 됩니다.

 


여기까지 django의 기본 기능을 기능을 사용하여 비밀번호를 초기화하였습니다.

 

하지만 일반 사용자가 갑자기 django 관리창에 넘어가면 당황하게 될 것이며

 

개발자 또한 디자인을 수정할 수 없는 페이지를 넣는 건 꺼려질 것입니다.

 

다음 게시물에서는 오늘 사용한 class를 오버 라이딩하여 꾸며보겠습니다.