http method의 종류
if request.method == 'GET':
# 조회
if request.method == 'GET':
# 생성
django에서 views.py를 통해 API를 구현할 때, 작성할 수 있는 방법을 의미한다.
각각 함수 기반, 클래스 기반을 의미한다.
함수로 view를 생성
클래스로 view를 생성
# Class Base View
class UserView():
def get(self, request):
# 사용자 정보 조회
pass
def post(self, request):
# 회원가입
pass
def put(self, request):
# 회원 정보 수정
pass
def delete(self, request):
# 회원 탈퇴
pass
# Function Base View
def user_view(request):
if request.method == 'GET':
pass
CBV 방식으로 작성할 때는 받아올 http method인 get, post, put, delete라고 함수 이름을 고정시켜 주어야 인식한다.
CBV 밖에서 함수를 하나 새로 생성해서 안에서 호출하는 방식을 사용하기
...생략
def sum_(num1, num2):
return num1+num2
class UserView(APIView):
...
def get(self, request):
sum_(**request.data)
return Response({"msg": "get method!!"})
...
from rest_framework.views import APIView
from rest_framework import permissions
class UserView(APIView):
permission_classes = [permissions.AllowAny]
# permission_classes = [permissions.IsAuthenticated]
# permission_classes = [permissions.IsAdminUser]
... 생략
기존방식은 render, redirect를 사용했었으나 DRF에서는 Response를 활용하여 API를 처리할 것
# render
return render(request, 'index.html')
# redirect
return redirect('/home')
# Response
from rest_framework.response import Response
return Response({"msg": "GET method!"})
프론트엔드 UI가 존재하지 않을 때 view를 테스트하기 위해서 필요한 프로그램
# POSTMAN-body-raw
{
"num1" : 5,
"num2" : 10
}
def get(self, request):
print(request.data) # JSON 형식의 데이터
result = sum_(**request.data) # request.data 언패킹
Response({"msg": f"get method -- sum result->{result}})
# 응용! *args 로 언패킹해서 데이터 사용하기
# postman
{
"numbers": [1,2,3,4,5,6]
}
# def sum
sum_(*args):
return sum(args)
# def get
numbers = request.data.get("numbers",[])
result = sum_(*numbers)
django에서 csrf로 데이터 유효성 검사를 실행하듯이 DRF에서도 사용해줘야 한다.
POSTMAN에서 아래의 코드를 함께 작성해야 한다!
var xsrfCookie = postman.getResponseCookie("csrftoken");
postman.setGlobalVariable('csrftoken', xsrfCookie.value);
또한 헤더에 담아서 보내줘야 한다
users = User.objects.filter(id=id) # return queryset
# queryset : [obj1, obj2, obj3]
# objects.filter는 오브젝트 개수와는 큰 관련이 없다
user = User.objects.get(id=id) # return object
# objects.get은 반드시 하나의 오브젝트 만을 필요로 한다. 없거나, 두 개 이상일 경우 에러!
# 추가1
model = Model(
field1="value1",
field2="value2"
)
model.save()
# 추가2
Model.objects.create(
field1="value1",
field2="value2"
)
# 조회
Model.objects.all()
Model.objects.filter()
Model.objects.get()
# 수정1
model = Model.objects.get(id=obj_id)
model.field = value
model.save()
# 수정2
Model.objects.filter(field__contains=value).update(
field1="value1",
field2="value2"
)
# 삭제
Model.objects.filter(field="value").delete()
Model.objects.get(id=obj_id).delete()
🤹♀️ 수정2에서 field__contains=value, double underbar?
try:
Model.objects.get(id=obj_id)
except Model.DoesNotExist:
# some event
return Response("존재하지 않는 오브젝트 입니다.")
Model.objects.all().order_by("join_date")
# 추가
# -join_date를 붙이면 역순으로 정렬
# .order_by("?") 사용 시 무작위 셔플
Model.objects.all().first()
# all()[0] 과 동일한 메서드
model, created = Model.objects.get_or_create(
field1="value1",
field2="value2"
)
if created:
# created event
else:
# already exist event
실제 실무에서는 django에서 기본으로 제공하는 AbstractUser가 아닌, DRF 커스텀 사용자 모델을 사용하여 개발한다.
def __str__(self):
return fullname
# 이렇게 작성해두면, 사용자가 계정을 생성할 때 오브젝트의 이름을 object(1) 대신, 김철수 로 받게 된다.
# 한줄 주석
def get():
'''
Docstring:
로그인 한 사용자의 정보를 데이터에 포함시켜서 리턴
'''
def delete(self, request):
logout(request)
return Response({"message": "delete method!"})