본문 바로가기
BE/Python & Django REST API

[Django REST API] 6. Setup the Database

by 건빵거늬 2021. 12. 18.
1. Create user database model
2. Add user model manager
3. Set custom user model
4. create migrations and sync DB

cf-1. auth-custom-user

https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#auth-custom-user

 

Customizing authentication in Django | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

1. Create user database model

(1) 하고자 하는 것

django에 내재된 default user model이 있음. 그것 기본적으로 username을 사용하는데 username 대신에 email address를 사용하도록 override 할 것임.

(2) model 작성

위 처럼 class 사용시 doc string 습관화 하기!!!

  • objects: model manager. custom user model을 django cli로 다루기 위해 정의해줘야함. 기본적으로 설정되어있지만 override하려는 것이지. 지금 당장 UserprofileManager를 만들지는 않았다. 2번 단계에서 구체화 할 예정
  • USERNAME_FIELD: 기본적으로 USERNAME_FIELD는 username field로 설정되어 있음. 이걸 email field로 바꿔주는 작업. 이 작업을 통해서 로그인 할 때 username과 password를 묻는 대신에, email와 password를 묻게 됨.
  • REQUIRED_FIELDS: 기본적으로 USERNAME_FIELD로 설정된 feild는 자동적으로 REQUIRED_FIELDS임. 우리는 email field로 설정해줬으니 email은 REQUIRED_FIELDS임. 그러나 name도 추가적으로 REQUIRED_FIELDS로 설정해주고 싶음. 따라서 REQUIRED_FIELDS에 리스트 형식으로 name field를 넣어주는 것.
  • get_full_name(self), get_short_name(self): Django의 다른 component와 통합하기 override하는 함수. custom 으로 만든 name은 short 과 full을 구분되지 않기 때문에, full 이든 short 이든 self.name을 출력하게끔 한다.

2. Add user model manager

(1) 하고자 하는 것

default model manager는 superuser을 만들 때 username feild와 passworld filed를 요구함. 그러나 custom으로 username filed를 email field로 바꾸었기 때문에 default model manager를 사용하면 올바르게 작동하지 않겠지. 따라서 원하는 대로 model manager를 사용할 수 있게끔 override 할 것임.

(2) model 작성

  • class UserProfileManager(BaseUserManager): BaseUserManager를 상속한다.
  • create_user(self, email, name, password=None): password를 specify 하지 않으면 default로 none을 할당하게 끔 한다. 왜냐하면 django password 시스템이 password를 hash로 사용하게끔 설계되어 있기 때문에 none password가 되면 제대로 작동하지 않기 때문이다. 이를 이용하여 password를 설정하기 전에는 authenticate가 불가능하게끔 만들 수 있다.
  • if not email: email이 emptry stiring 이거나 null value 이면
  • normalize_email(email): email의 @뒤쪽을 전부 소문자로 normalize 해주는 함수
  • user = self.model(email=email, name=name): user manager가 represent 하는 new record을 만듦. (추측: UserProfileManager가 UserProfile 안에서 호출되는 클래스 이므로 Userprofile 의 속성들을 사용하게 되겠지)
  • user.set_password(password): password를 hash값으로 encrypt 하기 위해 plain text로 작성하지 않고 set_password 함수를 통과하게끔 한다. 이렇게 함으로써 누군가가 database를 해킹하고 모든 정보를 가져가더라도 hash password만 보이기 때문에 이 사이트 외에 다른 사이트 (예를 들면 페이스북)에 동일한 id와 password로 접근하지 못하게 만든다. set_password는 AbstractBaseUser의 함수임. (추측: 피상속 클래스인 BaseUserManager가 AbstractBaseUser을 위한 것이기 때문에 BaseUserManager를 통해 model을 만들면 set_password를 사용할 수 있겠지)
  • user.save(using=self._db): 장고는 muliple databases을 사용할 수 있는데, 지금은 하나만 쓸 것임. 그러나 나중에 다양한 databases를 사용하게 될 때 헷갈릴 수 있으므로 using=self._db를 적어줌.
  • create_superuser(self, email, name, password): 모든 superuser는 password를 가지기 때문에 password=None을 해줄 필요 없다. is_staff는 custom UserProfile model 에서 설정해준 변수이고, is_superuser은 PermissionsMixin 에서 상속받은 변수임.

3. Set custom user model

(1) 하고자 하는 것

앞선 단계에서 custom user model을 열심히 작성하였다. 이제 장고 settings에서 default user model로 내가 만든 custom user model을 사용하게 끔 설정해줘야겠지.

(2) settings.py 수정

AUTH_USER_MODEL = 'profiles_api.UserProfile': profiles_api라는 이름의 앱의 models.py에서 UserProfile Model을 찾아서 기본 user model로 설정.

4. create migrations and sync DB

5. commit

댓글