[Django Rest Framework] #2

현지수·2022년 8월 26일
0

유튜브 참고 영상

✨ Django Rest API 만들기

  • 터미널에 pip install djangorestframework
  • settings.py에 rest_framework 등록하기
  • student 앱 하위에 api.pyserializers.py 생성하기

serializer란?
-> DB에 있는 값을 다 꺼내와서 json 형태로 바꿔줌 (문자열로 직렬화)

Django에서의 JSON은?
-> DRF를 사용하기 전에는 클라이언트 요청에 HTML, CSS, Javascript 등으로 응답을 했지만 DRF는 JSON 데이터로 소통을 한다.

Django에서 Form 클래스와 ModelForm 클래스 모두 제공하는 것처럼 DRF에서는 Serializer 클래스와 ModelSerializer 클래스 둘 다 제공한다.
Serializer와 ModelSerializer는 모델에 따라 필드 집합이 자동으로 생성되는 차이만 존재하고 동일하다.

Form 은 html 을 생성하고 Serializer는 JSON 문자열을 생성

  • student/serializers.py에 코드 작성
from rest_framework import serializers
from .models import Student

class StudentSerializer(serializers.ModelSerializer):

    class Meta:

        model = Student
        fields = '__all__'

fields 변수를 통해 student 모델 필드 중에 원하는 정보만 선택 가능하다.

Meta 클래스 옵션
db_table : 데이터베이스 내에서 테이블을 식별하는 데 사용해야하는 이름을 설정하는 데 사용
ordering : 모델 객체의 순서를 정의하는 데 사용
exclude : 특정 필드 제외

  • student/api.py에 코드 작성
from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import *
from rest_framework import status

class StudentList(APIView):
    def get(self, request):
        model = Student.objects.all()
        serializer = StudentSerializer(model, many=True)
        return Response(serializer.data)

studentlist를 불러오는 api 생성해보았다.
get 요청을 받았을 때, student 모델에서 모두 가져오고 model 변수에 넣는다. serializer로 데이터 타입을 변환하고 response로 serializer된 data를 보내준다.

  • rest_youtube_test/urls.py에 경로 지정
from django.contrib import admin
from django.urls import path
from student.api import StudentList

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/student_list', StudentList.as_view(),name='student_list')

✨ Django Rest API 생성(POST)

  • api 생성하기(student/api.py)
def post(self, request):
        serializer = StudentSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
  • 서버 들어가보면 post 생성되어 있음, 복붙해서 새로운 데이터 추가가 가능하다!

DRF를 학습하기 전에는 request.POST를 주로 사용했던 것 같은데 request와 response 처리 방식에 궁금한 점이 생겨서 공식문서를 참고하였다.

Request object
REST framework의 Request 객체는 HttpRequest 객체를 상속 받아 만들어 졌으며 보다 유용한 request parsing 기능을 제공한다.
Request 객체의 핵심 기능은 request.data 속성으로 request.POST와 비슷하지만 Web API 작업에 더 유용하다.

request.POST # 오직 폼 데이터를 처리하고, 오직 POST 메소드에서만 동작함
request.data # 임의의 데이터를 처리하고, POST와 PATCH 메소드에서 동작함

request.data는 json 요청도 처리할 수 있고, 다른 형식의 요청 또한 처리할 수 있다!

Response objects
REST Framework는 Response 객체를 가지고 있는데 바로TemplateResponse 유형이다. 렌더링 되지 않은 컨텐츠를 가져오고, 컨텐츠 협상을 통해 클라이언트에게 반환할 올바른 컨텐츠 형식을 결정한다.

return Response(data) # 클라이언트가 요청한 컨텐츠 유형으로 렌더링 함

Status codes
View에서 숫자로 이루어진 HTTP status 코드를 사용해도 항상 명확하게 읽는 것이 아니며 오류코드가 잘못 나오면 알아 차리는 것이 어렵다. REST Framework는 status 모듈 안에 있는 HTTP_400_BAD_REQUEST를 사용하여 각각의 상태 코드를 명확하게 한다.

profile
두두

0개의 댓글