TTL/5주차 ~ 8주차 TIL (9.26 ~ 10.21)

2022-10-04 TIL (장고django 비밀번호 변경 기능)

dev_junseok 2022. 10. 5. 01:54

먼저 장고의 비밀번호 변경 기능에는 두 가지 경우가 있습니다.

첫 째는 django가  제공하는 비밀번호를 변경하는 form, 두번째는 함수를 이용하여 기능을 구현할수 있습니다.

 

1. form 이용

비밀번호 변경을 위한 app의 views.py에 모듈을 import 해줍니다.

from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib import messages

그리고 다음 함수를 추가해줍니다.

def change_password(request):
  if request.method == "POST":
    form = PasswordChangeForm(request.user, request.POST)
    if form.is_valid():
      user = form.save()
      update_session_auth_hash(request, user)
      messages.success(request, 'Password successfully changed')
      return redirect('profile')
    else:
      messages.error(request, 'Password not changed')
  else:
    form = PasswordChangeForm(request.user)
  return render(request, 'change_password.html',{'form':form})

다음은 url을 작성해줍니다.

path('change_password/',views.change_password, name="re_password")

template에는 다음과 같이 추가합니다.

<form method="POST">
  {% csrf_token %}
  {{form}}
  <button type="submit">비밀번호 변경</button>
</form>

이제 실행시켜 보면 다음과 같은 화면을 보실 수 있습니

하지만 비밀번호를 설정하는데 제약도 많고, 화면도 이쁘지 않습니다...

form을 수정하는것은 꽤나 어려운 작업입니다.

 

다음은 함수만을 사용해 비밀번호 변경 기능을 구현해 보겠습니다.

from django.contrib.auth.hashers import check_password
from django.contrib import messages, auth

def change_password(request, id):
  if request.method == "POST":
    user = request.user
    origin_password = request.POST["origin_password"]
    if check_password(origin_password, user.password):
      new_password = request.POST["new_password"]
      confirm_password = request.POST["confirm_password"]
      if new_password == confirm_password:
        user.set_password(new_password)
        user.save()
        auth.login(request, user, backend='django.contrib.auth.backends.ModelBackend')
        return redirect('profile')
      else:
        messages.error(request, 'Password not same')
    else:
      messages.error(request, 'Password not correct')
    return render(request, 'change_password.html')
  else:
    return render(request, 'change_password.html')

기존의 비밀번호를 check_password를 이용해 맞는지 확인 후 새로 입력 받은 비밀번호 2개가 일치하는지 검사합니다.

그리고 기존의 회원가입과 유사한 방법으로 진행합니다.

user.set_password를 이용해 새로운 비밀번호를 설정한 뒤, 저장후 로그인을 시킵니다.

(backend = ....) 부분은 소셜로그인으로 인해 backend에 user 정보가 겹쳐져서 추가한 코드이므로 무시하셔도 괜찮습니다.

 

이 로직에 따라서 html을 다음과 같이 간단히 작성했습니다.

<html>
  <body>

    <form action="/user/password-edit/1/" method='POST'>
        {% csrf_token %}
        현재 비밀번호 : 
    <input name="origin_password" type="password">
    <br><br>
    변경할 비밀번호 :
    <input name="new_password" type="password">
    <br><br>
    비밀번호 확인 : 
    <input name="confirm_password" type="password">
    <br><br>
    <input class="btn btn-primary" type="submit" value="변경"> 
  </form>
</div>
  </body>
</html>

개인적으로 두개 다 사용해보니,함수만 사용해서 구현하는게 더 핸들링하기도 쉽고 커스텀하기도 쉬워서 더 좋은 방법인것 같습니다.