DRF 회원가입 구현
오늘 공부한 “DRF로 회원가입 구현하기”에서 배운 부분과, 오류 해결 및 해결 방법을 정리했다.
💻 ** 마주친 오류 & 해결방법 **
📝 코드
❌ 회원가입시 생긴 오류.
에러메세지 : create_user() got an unexpected keyword argument ‘phone’
오류 원인 : usermanager를 커스텀 할 때 phone
매개변수를 넘겨주지 않았다.
해결 방법 : /accounts/managers.py를 수정해줌으로 해결.
❌ JWT에서 디코딩 오류.
에러메세지 : jwt.exceptions.DecodeError: … “algorithms” argument when calling decode()
오류 원인 : decode 메소드의 매개변수인 algorithm
을 지정해주지 않아서 생긴 오류였다.
해결 방법 : algorithm = ‘HS256’으로 지정해주었다. (유뷰브 강의 댓글확인.)
token_decoding = jwt.decode(token, os.getenv('SECRET_KEY'), 'HS256')
# 출력 결과
{
'token_type': 'access',
'exp': 1640763234,
'iat': 1640762334,
'jti': '37edb32aebc249a3a4e5102e42708d2d',
'user_id': 19
}
❌ 이메일 전송 오류.
에러메세지 : smtplib.SMTPAuthenticationError: …password required
오류 원인 : ‘메일App 비밀번호’가 설정되어 있지 않았다.
해결 방법 : App 비밀번호 설정.
❌ Migration 오류.
- 해결방법1
⒈ migration 폴더 삭제
⒉ 다시 migrate
- 해결방법2
⒈ DB 삭제
⒉ 다시 migrate
💡 ** 알게 된 부분 **
1. runserver
python manage.py runsercer 호스트:포트
해당 호스트:포트
로 서버가 시작된다.
2. Email 보내기
# settings.py
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD')
SERVER_EMAIL = os.getenv('EMAIL_HOST_PASSWORD')
DEFAULT_FROM_MAIL = os.getenv("SERVER_EMAIL")
# utils.py
from django.core.mail import EmailMessage
import threading
class EmailThread(threading.Thread):
def __init__(self, email):
self.email = email
threading.Thread.__init__(self)
def run(self):
self.email.send()
class Util:
@staticmethod
def send_email(data):
email = EmailMessage(
subject=data['email_subject'], body=data['email_body'], to=[data['to_email']])
EmailThread(email).start()
3. @staticmethod & @classmethod
정확하게 이해하진 못했지만, @classmethod과 @staticmethod의 차이는 상속에서
두드러지는 것 같다.
class Person:
default= "아빠"
def __init__(self):
self.data = self.default
@classmethod
def class_person(cls):
return cls()
@staticmethod
def static_person():
return Person()
class WhatPerson(Person):
default = "엄마"
person1 = WhatPerson.class_person() # 엄마
person2 = WhatPerson.static_person() # 아빠
4. validate_field() VS validate()
특정 필드에 대한 유효성 검사를 진행할 때에는 validate_field
메서드를 호출하여 사용한다.
하지만 두 개 이상의 필드에 대해서 유효성 검사를 진행할 때에는 validate
메서드를
호출하여 사용한다. 추가적으로 attrs는 OrderDict 클래스를 반환해 준다.
def validate(self, attrs):
email = attrs.get('email', ' ')
username = attrs.get('username',' ')
if not email:
raise serializers.ValidationError(self.default_error_messages)
# .isalum() 문자열이 영어, 한글 혹은 숫자로 되어있으면 참 리턴, 아니면 거짓 리턴.
if not username.isalnum():
raise serializers.ValidationError(self.default_error_messages)
return super().validate(attrs)
# attrs 출력값.
"""
OrderedDict(
[
('email', 'test@test.com'),
('username', 'test'),
('gender', 'M'),
('phone', '010-1234-1234'),
('password', 'test')
]
)
"""