def validate_password(self, password):
"""비밀번호 유효성 검사"""
if len(password) < 8:
raise ValidationError("비밀번호는 8자리 이상이어야 합니다.")
if not re.search(r"[a-zA-Z]", password):
raise ValidationError("비밀번호는 하나 이상의 영문이 포함되어야 합니다.")
if not re.search(r"\d", password):
raise ValidationError("비밀번호는 하나 이상의 숫자가 포함되어야 합니다.")
if not re.search(r"[!@#$%^&*()]", password):
raise ValidationError("비밀번호는 적어도 하나 이상의 특수문자(!@#$%^&*())가 포함되어야 합니다.")
return password
def validate_email(self, email):
email_regex = re.compile(
r"^[a-zA-Z]+[!#$%&'*+-/=?^_`(){|}~]*[a-zA-Z0-9]*@[\w]+\.[a-zA-Z0-9-]+[.]*[a-zA-Z0-9]+$"
)
email_validation = email_regex.match(email)
if not email_validation:
# 알파벳 대/소문자로 시작. 특수문자로 마무리 안됨. @와 .이 포함되었는지 확인
raise ValidationError("이메일 형식이 올바르지 않습니다!")
return email
def create(self, validated_data):
password = validated_data.pop("password")
email = validated_data.pop("email")
self.validate_password(password)
self.validate_email(email)
user = User(**validated_data, email=email)
user.set_password(password)
user.save()
password 또는 Email을 리턴하지 않으면 Validated_data 에서 None이 된다. 커스텀 검증할때 장고에서 미리 설정해준듯.