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