일반 user model은 필드가 고정되어 있는데에 반해,
custom user model 사용시에 필드들을 자유롭게 커스텀 할 수 있다.
models.py
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
# custom user model 사용 시 UserManager 클래스와 create_user, create_superuser 함수가 정의되어 있어야 함
class UserManager(BaseUserManager):
def create_user(self, username, password=None):
if not username:
raise ValueError('Users must have an username')
user = self.model(
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
# python manage.py createsuperuser 사용 시 해당 함수가 사용됨
def create_superuser(self, username, password=None):
user = self.create_user(
username=username,
password=password
)
user.is_admin = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
username = models.CharField("사용자 계정", max_length=20, unique=True)
email = models.EmailField("이메일 주소", max_length=100)
password = models.CharField("비밀번호", max_length=128)
fullname = models.CharField("이름", max_length=20)
join_date = models.DateTimeField("가입일", auto_now_add=True)
# is_active가 False일 경우 계정이 비활성화됨
is_active = models.BooleanField(default=True)
# is_staff에서 해당 값 사용
is_admin = models.BooleanField(default=False)
# id로 사용 할 필드 지정.
# 로그인 시 USERNAME_FIELD에 설정 된 필드와 password가 사용된다.
USERNAME_FIELD = 'username'
# user를 생성할 때 입력받은 필드 지정
REQUIRED_FIELDS = []
objects = UserManager() # custom user 생성 시 필요
def __str__(self):
return self.username
# 로그인 사용자의 특정 테이블의 crud 권한을 설정, perm table의 crud 권한이 들어간다.
# admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
def has_perm(self, perm, obj=None):
return True
# 로그인 사용자의 특정 app에 접근 가능 여부를 설정, app_label에는 app 이름이 들어간다.
# admin일 경우 항상 True, 비활성 사용자(is_active=False)의 경우 항상 False
def has_module_perms(self, app_label):
return True
# admin 권한 설정
@property
def is_staff(self):
return self.is_admin
settings.py
AUTH_USER_MODEL = 'user.User' # app.table 형태
from django.contrib.auth import login, authenticate
class UserApiView(APIView):
# 로그인
def post(self, request):
username = request.data.get('username', '')
password = request.data.get('password', '')
user = authenticate(request, username=username, password=password)
if not user:
return Response({"error": "존재하지 않는 계정이거나 패스워드가 일치하지 않습니다."}, status=status.HTTP_401_UNAUTHORIZED)
login(request, user)
return Response({"message": "로그인 성공!!"}, status=status.HTTP_200_OK)
CBV
(Class Based View)views.py
를 구성하는데 def
형식을 사용하면 FBV(Function Based View)
class
형식을 사용하면 CBV(Class Based View)
FBV는 구현하기 편하고 읽기 편하지만 확장 및 재사용이 어렵고
CBV는 읽기 어렵고 코드 이해를 위해 상속 등을 고려해야하지만 확장 및 재사용이 용이하다는 각각의 장단점이 있다.
# views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import permissions
class UserView(APIView): # CBV 방식
permission_classes = [permissions.AllowAny] # 누구나 view 조회 가능
# permission_classes = [permissions.IsAdminUser] # admin만 view 조회 가능
# permission_classes = [permissions.IsAuthenticated] # 로그인 된 사용자만 view 조회 가능
def get(self, request):
return Response({'message': 'get method!!'})
def post(self, request):
return Response({'message': 'post method!!'})
def put(self, request):
return Response({'message': 'put method!!'})
def delete(self, request):
return Response({'message': 'delete method!!'})
상담 결과: 시간이 날때마다 MySQL을 꼭 공부하고 지금 django 프로젝트 중간중간 적용시키는 연습을 해야한다.
원하는 직무를 포기해서라도 가고 싶은 회사를 가는 것은 비 추천, 내가 하고 싶은 직무를 살려 다른 회사를 알아 보는 것을 추천.
호주 영주권 준비(만 32세 점수를 받으며 overall 8점이면 85점, 주정부 후원 5점 가능).
슬슬 포트폴리오를 조금이라도 준비하기.