회사 프로젝트가 여유가 있어지면서 토이 프로젝트를 만들어 보기로 했다.
지금까지 Django에서 지원하는 여러가지 기능을 많이 활용하지 않았다.(회사 프로젝트 또한 그렇게 구현되어 있지 않다.) 그래서 토이 프로젝트를 진행하며 회사 프로젝트에 적용할 수 있는 것들을 찾아보려 한다.
User models.py를 작성중에 AbstractBaseUser와 AbstractUser 둘 중에 헷갈렸다.
AbstractBaseUser : password, last_login이 기본으로 만들어지는 modelAbstractUser : username, first_name, last_name, email, date_joined, password, last_login 등 여러가지 컬럼이 기본적으로 지원이 된다.나는 내가 필요한 컬럼만 사용하기를 원해서 AbstractBaseUser를 선택했다.
아래는 회원가입 로직이다.
# user/models.py
class UserManager(BaseUserManager):
use_in_migrations = True
def create_user(self, username, email, password, **extra_fields):
if not email:
raise ValueError('The given email must be set')
if not username:
raise ValueError('The given username must be set')
if not password:
raise ValueError('The given password must be set')
email = BaseUserManager.normalize_email(email)
user = self.model(
username=username,
email=email,
nickname=username,
**extra_fields
)
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
user.set_password(password)
user.save()
return user
# user/views.py
class SignUp(APIView):
renderer_classes = [JSONRenderer]
permission_classes = [AllowAny]
model = User
def post(self, request):
try:
data = request.data
username = data.get('username')
UserManager.create_user(self, username=username, email=data.get('email'),
password=data.get('password'))
return JsonResponse(json_success('S0009', None), status=status.HTTP_201_CREATED)
except django.db.utils.IntegrityError as I:
if str(I.args).rfind('email') > 0:
return JsonResponse(json_error('E0007'), status=status.HTTP_400_BAD_REQUEST)
elif str(I.args).rfind('username') > 0:
return JsonResponse(json_error('E0008'), status=status.HTTP_400_BAD_REQUEST)
else:
return JsonResponse(json_error('E0400'), status=status.HTTP_400_BAD_REQUEST)
except ValueError:
return JsonResponse(json_error('E0400'), status=status.HTTP_400_BAD_REQUEST)
except django.db.utils.DataError as e:
if str(e.args).rfind('too long') > 0:
return JsonResponse(json_error('E0017'), status=status.HTTP_400_BAD_REQUEST)
except KeyError:
return JsonResponse(json_error('E0002'), status=status.HTTP_400_BAD_REQUEST)
SignUp API를 통해 요청이 들어오면 UserManager.crete_user를 통해 email, username, password의 validate를 체크한다.
ValueError를 통해 데이터 유무 체크django.db.utils.IntegrityError를 통해 DB에 일치된 데이터 확인django.db.utils.DataError를 통해 데이터 규격 체크BaseUserManager.normalize_email를 통해 email 형식 체크user.set_password(password)에서 Django에서 세팅된 비밀번호 형식으로 암호화