WIL

손성수·2023년 5월 15일

Django

유저 커스텀 모델

  • is_active 필드

email 인증을 받고 나서 user의 is_active를 True로 설정하기 위해서
기본값을 False로 설정
그런데 admin 계정 역시 is_active가 기본값이 False로 되었다.

class User(AbstractBaseUser):
	... 코드 생략
	
    # 관리자 권한
    is_admin = models.BooleanField(default=False)
    # 계정 활성화
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.email

  • UserManager 재정의

UserManager 클래스의 메서드중
create_superuser를 오버라이딩 하여 재정의 필요

class UserManager(BaseUserManager):
    def create_user(self,email,username,is_seller,password=None):

       ... 코드 생략

    # python manage.py createsuperuser 사용 시 해당 함수가 사용됨
    def create_superuser(self,email,username,is_seller,password=None):
        user = self.create_user(
            email,
            password=password,
            username=username,
        )
        user.is_admin = True
        user.is_active = True
        user.save(using=self._db)
        return user

is_active를 admin 계정 생성시 True로 설정하여 해당 문제를 해결했다.



Many To Many Field

팔로우 기능을 구현하기 위해서 커스텀 유저 모델에 followings 필드 생성

followings = models.ManyToManyField('self', symmetrical=False, related_name='followers', blank=True)

자신의 model과 ManyToMany 관계를 맺는다.


  • symmetrical = True
    양방향 관계에 필요한 경우에 사용
    예시 : A가 B를 팔로우하면 , 동시에 B가 A를 팔로우 하게 된다.
  • symmetrical = False
    단방향 관계에 필요한 경우에 사용
    예시 : A가 B는 서로 독립적, A가 B를 팔로우해도 B는 자동으로 A를 팔로우 하지 않는다.

one to one , one to many , many to many 의 관계에서
역참조(역 관계) 하기 위해서 model_set을 사용할 수 있다.

related_name을 사용하면 역참조하기 위한 이름을 임의로 정의할 수 있다.



장고 이메일 발송 구현

기능 구현

  • 먼저 user model의 is_active 필드를 기본값을 False로 설정한다.
  • 사용자가 회원가입을 해도, 메일 인증을 하지 않으면 계정은 비 활성화 된다.
  • 인증 메일은, 관리자의 구글 계정을 통해 이메일을 보낸다.

구글 계정의 2단계 인증 활성화

구글 앱 비밀번호 설정

  • 2단계 인증을하고 앱 비밀번호를 발급받는다.
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = os.environ.get("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = os.environ.get("EMAIL_HOST_PASSWORD")
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
  • EMAIL HOST USER : 이메일을 발송하는 구글 계정
  • EMAIL HOST PASSWORD : 발급받은 앱 비밀번호

민감한 정보가 담긴 데이터 이므로 .env 환경변수를 사용하여 관리한다.


이메일을 발송하기 위한 코드

from django.core.mail import EmailMessage
class AuthFunction():
    def send_mail(self,email):
        code = "".join([str(random.randrange(0, 10)) for i in range(6)])
        title = "B4GAMES 가입 인증 코드 발송"
        content = f"인증 코드 = {code}"
        mail = EmailMessage(title, content, to=[email])
        mail.send()

        # 올바른 이메일로 발송했는지 검증 절차 필요
        return code


소셜 계정으로 로그인

유튜브 강의

공식 문서

  • 구글 계정으로 프로젝트를 생성하고 키를 발급받는것은 강의 영상 참고

allauth 라이브러리 설치
pip install django-allauth

settings.py

INSTALL_APP = [
	...
    # 기본으로 있으며, all-auth에 필요한 app
    'django.contrib.sites', #
    django.contrib.messages',
    
    ### all-auth를 사용하기 위해 필요한app
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    
    # 로그인 연결할 소셜 계정
    'allauth.socialaccount.providers.google',
    # 'allauth.socialaccount.providers.kakao',
    # 'allauth.socialaccount.providers.naver',
]
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',  # <- 디폴트 모델 백엔드
    'allauth.account.auth_backends.AuthenticationBackend',  # <- 추가
)
# 여러 사이트를 관리하는 용도
SITE_ID = 1
LOGIN_REDIRECT_URL ='http://127.0.0.1:3722/html/home.html'

# Provider specific settings
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'APP': {
            'client_id': os.environ.get("client_id"),
            'secret': os.environ.get("secret"),
            'key': ''
        }
    }
}

클리언트 아이디와 시크릿키는 민감한 정보이므로 환경변수를 통해 관리한다.

urls.py

path('accounts/', include('allauth.urls')), # 이메일 인증 URL
profile
더 노력하겠습니다

0개의 댓글