Django User

이재문·2022년 5월 28일
0

회사 프로젝트가 여유가 있어지면서 토이 프로젝트를 만들어 보기로 했다.
지금까지 Django에서 지원하는 여러가지 기능을 많이 활용하지 않았다.(회사 프로젝트 또한 그렇게 구현되어 있지 않다.) 그래서 토이 프로젝트를 진행하며 회사 프로젝트에 적용할 수 있는 것들을 찾아보려 한다.

User Model 관리

User models.py를 작성중에 AbstractBaseUserAbstractUser 둘 중에 헷갈렸다.

  • AbstractBaseUser : password, last_login이 기본으로 만들어지는 model
  • AbstractUser : username, first_name, last_name, email, date_joined, password, last_login 등 여러가지 컬럼이 기본적으로 지원이 된다.

나는 내가 필요한 컬럼만 사용하기를 원해서 AbstractBaseUser를 선택했다.


User Account

아래는 회원가입 로직이다.

# 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에서 세팅된 비밀번호 형식으로 암호화

profile
이제부터 백엔드 개발자

0개의 댓글