내일배움캠프 - DRF 1, 2일차 개발일지

Dongwoo Kim·2022년 6월 16일
0

내일배움캠프 - DRF

목록 보기
3/12

스파르타 코딩클럽

내일배움캠프 AI 웹개발자양성과정 2회차

DRF 1, 2일차 개발일지

0. 강의 요약

  • CBV 구조의 view에 대한 이해
  • http method 종류의 이해
  • Postman / cbv 통신 실습
  • custom user model 생성
  • permission class에 대한 이해
  • 외래 키 종류에 대한 구조와 이해(foreign key, one-to-one, many-to-many)

1. CBV (Class-based views)

: views.py의 기능을 class 기반으로 작성

  • 기존 방법 FBV (Function-based views)

    def user_view(request):
    	# 로그인 기능
    	if request.method == 'GET':
    		...
  • CBV

    class UserView(self, request):
    	def get(self, request):
    		...
  • 특징 : 상속 및 믹스인을 활용하여 보기를 구조화하고 코드를 재사용 가능 (Class-based views - Django documentation)

2. http method 종류의 이해

: 하나의 url로 데이터의 CRUD (create, read, update, delete)의 기능별로 method를 나눠서 처리

  • get : read
  • post : create
  • put : update
  • delete : delete

3. Postman / cbv 통신 실습

1) postman 사용방법

Body - raw 선택 - JSON 선택 후 request parameters 작성

2) postman csrftoken

  • Tests에 해당 코드 작성

    var xsrfCookie = postman.getResponseCookie("csrftoken");
    postman.setGlobalVariable('csrftoken', xsrfCookie.value);

  • Headers에 key, value 작성

    KEY : X-CSRFToken
    VALUE : {{csrftoken}}

3) CBV

# user/urls.py
from . import views

urlpatterns = [
    path('login/', views.UserApiView.as_view()),
]
# user/views.py
# 로그인 로그아웃 기능
class UserApiView(APIView):
    # 로그인
    def post(self, request):
        user = authenticate(request, **request.data)
        
        if not user:
            msg = '아이디 또는 패스워드를 확인해주세요.'
            return Response({'message': msg})

        login(request, user)
        msg = '로그인 성공!'
        return Response({'message': msg}, status=status.HTTP_200_OK)

    # 로그아웃
    def delete(self, request):
        logout(request)
        msg = '로그아웃 성공!'
        return Response({'message': msg})

4. custom user model 생성

1) UserManager

: custom model에 필요

from django.contrib.auth.models import BaseUserManager, AbstractBaseUser

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

2) User

class User(AbstractBaseUser):
    username = models.CharField("사용자 아이디", max_length=12, 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)
    
    def __str__(self):
        return self.username

    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.is_admin

5. permission class에 대한 이해

1) permission_class 설정

: permission은 기본적으로 class단위로 설정 가능

# user/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!!'})

6. 외래 키 종류에 대한 구조와 이해(foreign key, one-to-one, many-to-many)

1) ForeignKeyField

: one-to-many 관계 (class model과 on_delete 설정해야줘야함)

2) OneToOneField

: one-to-one 관계 (ForeignKeyField에 unique=True한 것과 같은 원리)

3) ManyToManyField

: many-to-many 관계, 중간 table 생성됨

  • example
class MyTopping(models.Model):
    class Meta:
        db_table = "my_topping"

    def __str__(self):
        return self.topping_name

    topping_name = models.CharField(max_length=100)


class MyPizza(models.Model):
    class Meta:
        db_table = "my_pizza"

    def __str__(self):
        return self.pizza_name

    pizza_name = models.CharField(max_length=100)
    pizza_topping = models.ManyToManyField(MyTopping)

과제

profile
kimphysicsman

0개의 댓글