2023-05-29 TIL

0v0baek·2023년 5월 29일
0

TIL

목록 보기
63/92

[django] 비밀번호 재생성 후 메일 보내기

이전 TIL에서 회원가입 시 이메일 인증을 구현했는데,
이번에는 비밀번호를 까먹었을 때 이메일로 리셋된 새 비밀번호를 보내는 메소드를 구현했다.

✅ 코드 구현

🔎 users/serializers.py

1) 랜덤으로 영문합 6글자를 리턴하는 함수

import random, string

def reset_password():
    new_str = string.ascii_letters + string.digits
    return "".join(random.choice(new_str) for _ in range(6))

python 내장 함수인 string을 불러와서
new_str을 아스키 문자(영어 대문자 소문자 합)와 1의 자리 숫자 전체를 합친 것으로 만든다.

new_str을 출력하면 이렇게 나온다.

>>>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

이걸 for문을 돌려 랜덤으로 6문자를 뽑아내고, join 메소드를 사용해서 하나의 문자로 만든다.

2) 패스워드 리셋 시리얼라이저

class UserPasswordSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ("email",)

    def update(self, instance, validated_data):
        password = reset_password()
        instance.set_password(password)
        instance.save()

        to_email = instance.email
        email = EmailMessage(
            "IOTD : 비밀번호 변경 이메일",
            f"변경된 임시 비밀번호는 {password} 입니다. \n\n 로그인 후 반드시 회원 정보 수정에서 비밀번호를 변경해주세요.",
            to=[to_email],
        )
        email.send()

        return instance

패스워드를 리셋할 시 유저가 회원가입 시 등록한 이메일로 리셋한 패스워드를 보내주는 메소드다.

serializers.ModelSerializer를 상속받아 update 함수를 오버라이딩하고,
이전과 같이 EmailMessage 를 활용해서 메일을 보냈다.

🔎 users/views.py

class UserPasswordView(APIView):
    """유저의 이메일 정보로 패스워드를 리셋시켜주기"""
    
    def put(self, request):
        user = get_object_or_404(User, email=request.data.get("email"))
        serializer = UserPasswordSerializer(user, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(
                {"message": "비밀번호 수정 이메일을 전송했습니다."}, status=status.HTTP_200_OK
            )
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

유저가 입력한 emailUser 모델에서 유저를 찾는다.
그러고 그 유저를 시리얼라이저로 넘겨준 뒤,
is_valid를 통과하면 이메일을 보내게 한다.

🔎 users/urls.py

urlpatterns = [
    ...
    path("password/", views.UserPasswordView.as_view(), name="user_password_view"),

패스워드 뷰를 url에 연결시켜주자.

profile
개발 공부 하는 비전공자 새내기. 꾸준히 합시다!

0개의 댓글