[ 06/16 TIL ] custom user model, CBV

JoonQpa·2022년 6월 16일
0

TIL

목록 보기
18/27
post-thumbnail
  • custom user model 만들기
  • CBV

📌 Custom User Model 만들기

일반 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 형태

`views.py` 로그인 기능 구현
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점 가능).

슬슬 포트폴리오를 조금이라도 준비하기.

profile
Intuition factory: from noob to pro

0개의 댓글