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 클래스의 메서드중
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로 설정하여 해당 문제를 해결했다.
팔로우 기능을 구현하기 위해서 커스텀 유저 모델에 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단계 인증 활성화
- https://myaccount.google.com/security
- G-mail을 Django에서 사용하기위한 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
민감한 정보가 담긴 데이터 이므로 .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