이전 TIL에서 회원가입 시 이메일 인증을 구현했는데,
이번에는 비밀번호를 까먹었을 때 이메일로 리셋된 새 비밀번호를 보내는 메소드를 구현했다.
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
메소드를 사용해서 하나의 문자로 만든다.
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
를 활용해서 메일을 보냈다.
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)
유저가 입력한 email
로 User
모델에서 유저를 찾는다.
그러고 그 유저를 시리얼라이저로 넘겨준 뒤,
is_valid
를 통과하면 이메일을 보내게 한다.
urlpatterns = [
...
path("password/", views.UserPasswordView.as_view(), name="user_password_view"),
패스워드 뷰를 url
에 연결시켜주자.