반응형
장고에서 유저를 관리하다보면 패스워드를 변경해야하는 경우가 생긴다.
이런 경우를 위해 장고에서는 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)
'Coding > Python' 카테고리의 다른 글
Django+Nginx CORS 문제 해결 방법 (0) | 2018.06.05 |
---|---|
Django JWT 토큰인증 정리 (0) | 2018.05.01 |
Django Partial Update 정리 (0) | 2018.04.30 |
Django Taggit으로 해시태그 검색 정리 (0) | 2018.04.29 |
Django delete(), add(), remove(), @property 정리 (0) | 2018.04.23 |