본문 바로가기
source-code/Django

Django REST Framework _ User Custom

by mattew4483 2021. 2. 17.
728x90
반응형

웹사이트의 활력소! User 기능!

물론 지금도 이를 사용하고 있지만... 아무것도 Custom 되지 않은 밋밋한 User에 불과하다!

 

따라서 DRF에서도 User Custom을 적용할 예정.

 

2021/01/07 - [Django] - Blogs App _ 인증 기능 with 사용자 지정

 

Blogs App _ 인증 기능 with 사용자 지정

인증 기능을 개발할 때 django의 User 테이블을 통해 만들었다. 즉 이미 django에서 정해준 값만을 입력할 수 있었다!! 당연히 항상 이런 상황만 생기지는 않는다. 그렇기 때문에 이번에는 직접 User 모

23life.tistory.com

이전 Django User Custom과 유사한 부분이 많다!


우선 DRF User Custom의 관전 포인트는...

현재 rest_auth와 allauth를 통해 로그인/로그아웃과 회원가입을 진행하고 있는데...

마음대로 User를 Custom해도 이 녀석들이 알아들을까..? 하는 것!

krakensystems.co/blog/2020/custom-users-using-django-rest-framework

 

Custom users using Django REST framework | Kraken Systems Ltd.

The built-in Django User model follows the pattern consisted of username, email and password. In this tutorial you will learn to RESTfully simplify it to just email and password.

krakensystems.co

한 외국 블로그 참고! 알아보기 쉬워서 좋았다.

 

1. rest_auth / allauth 적용

2021/02/15 - [Django] - Django REST Framework _ 회원가입 구현하기

 

Django REST Framework _ 회원가입 구현하기

현재 우리는 api-auth란 URL요청을 통해 rest_framework.urls로 로그인과 로그아웃을 진행한다! urls.py 바로 요 녀석! 그런데 얘만으로는 createsuperuser로 생성한 User밖에 로그인/로그아웃이 되지 않는다! 따.

23life.tistory.com

요 녀석은 다 갖춰진 상태여야한다!

 

2. accounts 앱 만들기

Custom User를 담당할 account라는 앱을 새로 만들어준다. startapp!

바로 에러! 무슨 일인가 살펴보니...

account라는 앱이 unique하지 않단다. 나는 account 앱을 처음 만드는데?

settings.py

settings.py를 보니 allauth 패키지에 account라는 앱이 이미 있었다! 띠용.

따라서 account가 아닌, 다른 앱 이름을 사용해 만들어주자. 다시 startapp!

(settings.py에 적어주는 걸 잊지 말자)

 

3. User Custom 하기

새로 만든 앱에서 User Custom을 진행할 예정!

따라서 새로운 User 모델을 만들어주자.

 

models.py

필요한 녀석들 몽땅 import 해주시고,

 

길다 길어! 

밑에 작성하는 BlogUser부터 살펴보자.

 

전체적으로 이전 django User Custom과 유사하다!

새로 바뀐 점들만 살펴보자면...

 

제일 먼저 EmailField의 _ 가 무엇?

from django.utils.translation import ugettext_lazy as _ ← 여기서 가져온 녀석.

얘는 Django Translation의 일환으로 비영어권 사용자들을 위한 다국어 지원 방법이라고 한다!

 

이전에는 AbstractBaseUser의 default값인 username을 통해 User를 구분했다.

 

하지만 username=None으로 username필드를 없애고,

USERNAME_FIELD = 'email'를 통해 email이 해당 역할을 수행하도록 만들었다!!

 

다음은 이렇게 Custom 한 User를 생성하는 BlogUserManager!

 

역시 이전과 유사하다. username 대신 email을 사용했다는 차이!

 

그런데 여기서 nomalize_email이라는 녀석이 사용되었다.

얘는 EmailField에서 @ 뒤의 대소문자 구분을 없앰으로써 다중 가입을 방지하는 역할.

이게 무슨 소리? lee@gmail.com이나 lee@Gmail.Com이나 똑같이 만든다는 뜻!

 

4. Settings 수정

User를 건드렸으니 settings에 이를 알려주자!

settings.py

우선 요 녀석을 명시(이제부터 User는 Custom 한 BlogUser입니다요)해주고...

 

그 밑에 요놈들을 적어줘야 한다!

이게 어디서 나온 건가유...? 

흠냐냐. here 여기서 무슨 의미인지 살펴볼 수 있다.

 

이까지 완료했다면 첫 makemigrations - migrate !

 

5. URL 수정

urls.py

우리는 rest_auth.urls를 사용(token 발급)! 별 수정은 필요 없다.


제일 먼저 createsuperuser를 진행해보자.

쨔잔. 우리의 Custom대로 Email이 username을 대신하게 되었다.

 

admin.py

Admin 페이지에 이렇게 등록해주면...

 

와우! 블로그 유저들 이라는 Custom User가 잘 들어가 있다.

 

이제 URL 요청을 통해 User 생성 및 로그인/로그아웃을 진행해보자.

 

우선 회원가입!

http://127.0.0.1:8000/rest-auth/registration/

이전과 마찬가지지만... 이제 반드시 입력해야 하는 칸이 username이 아닌 email로 바뀐 모습!

 

또한 settings에서 

이렇게 줬기 때문에 username 필드는 has no more than 0 characters 가 되어야 한다.

 

http://127.0.0.1:8000/rest-auth/registration/

POST 요청을 보내보니... 띠요용. 인증 email이 보내졌다!

갑자기 왜 이런 기능이 수행되는 것????

 

settings.py

요 녀석들 때문!

 

이 중 ACCOUNT_AUTHENTICATION_METHOD를 통해 email 인증 기능이 이뤄진다.

mandatory는 이메일 인증을 해야만 로그인이 가능하고,

optional은 인증 이메일은 발송되지만 인증하지 않아도 로그인이 가능하며,

none은 인증 이메일을 보내지 않고도 로그인할 수 있다.

해당 이메일 내용! 하지만 현재 필요가 없으니... 몽땅 주석처리!

 

다시 규칙에 맞게 email과 password를 입력, POST 요청을 보내보면...

흐으음... 소켓 전송 에러라고 하는디...

 

일단 Admin 페이지로 들어가 보자.

회원가입이 이뤄지기는... 한 모습!

 

token도 잘 발급되었다..!

 

로그인과 로그아웃은?

http://127.0.0.1:8000/rest-auth/login/

이렇게 로그인 요청을 보내면..!

 

http://127.0.0.1:8000/rest-auth/login/

쨔잔. 역시나 정상 작동.

 

http://127.0.0.1:8000/rest-auth/logout/

로그아웃도 마찬가지다!

728x90
반응형