: 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)
: 하나의 url로 데이터의 CRUD (create, read, update, delete)의 기능별로 method를 나눠서 처리
Body - raw 선택 - JSON 선택 후 request parameters 작성
Tests에 해당 코드 작성
var xsrfCookie = postman.getResponseCookie("csrftoken"); postman.setGlobalVariable('csrftoken', xsrfCookie.value);
Headers에 key, value 작성
KEY : X-CSRFToken VALUE : {{csrftoken}}
# 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})
: 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
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
: 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!!'})
: one-to-many 관계 (class model과 on_delete 설정해야줘야함)
: one-to-one 관계 (ForeignKeyField에 unique=True한 것과 같은 원리)
: many-to-many 관계, 중간 table 생성됨
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)