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')
    ]
)
"""


📚 References