Django User

이재문·2022년 5월 28일

회사 프로젝트가 여유가 있어지면서 토이 프로젝트를 만들어 보기로 했다.
지금까지 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개의 댓글