본문으로 바로가기

Django Change Password 정리

category Coding/Django 2018. 4. 30. 20:14
반응형

장고에서 유저를 관리하다보면 패스워드를 변경해야하는 경우가 생긴다.

이런 경우를 위해 장고에서는 check_password()와 new_password() 라는 함수를 제공한다.

먼저 입력값 중 current_password와 new_password는 변수명을 통해 진행한다고 가정한다.


user = request.user
current_password = request.data.get('current_password', None)

if current_password is not None:
passwords_match = user.check_password(current_password)


먼저 current_password에 입력값 중 current_password라는 변수명의 값을 담는다.

그리고 해당 값이 None이 아니라면(존재한다면) passwords_match에 check_password()함수를 통해 현재 패스워드가 맞는지 확인한다.

user에 request.user를 담았으므로 현재 요청한 유저의 오브젝트가 들어있을 것이다.

현재 요청한 유저의 password가 입력값과 같은지 비교하는 것이다.

(참고로 check_password()의 리턴값은 True/False이다)


if passwords_match:
new_password = request.data.get('new_password', None)
if new_password is not None:
user.set_password(new_password)


그다음 새로운 패스워드도 담아주고 set_password()를 통해 새로운 패스워드로 변경시켜준다.

마지막으로 .save()를 통해 저장시켜주면 된다.

최종 코드는 아래와 같다.


class ChangePassword(APIView):
def put(self, request, username, format=None):
user = request.user
current_password = request.data.get('current_password', None)

if current_password is not None:
passwords_match = user.check_password(current_password)

if passwords_match:
new_password = request.data.get('new_password', None)
if new_password is not None:
user.set_password(new_password)
user.save()

아, 마지막으로 현재 로그인한 유저가 패스워드를 수정하려는 유저와 같은 지 비교해야한다.

if user.username == username으로 한번 더 감싸준 후 마무리한다.

최종코드 : 


class ChangePassword(APIView):
def put(self, request, username, format=None):
user = request.user

if user.username == username:
current_password = request.data.get('current_password', None)

if current_password is not None:
passwords_match = user.check_password(current_password)

if passwords_match:
new_password = request.data.get('new_password', None)
if new_password is not None:
user.set_password(new_password)
user.save()
return Response(status=status.HTTP_200_OK)

else:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
return Response(status=status.HTTP_400_BAD_REQUEST)
else:
return Response(status=status.HTTP_401_UNAUTHORIZED)


반응형