본문 바로가기

데브코스/TIL

[TIL] 4주차_Day13: Django 프레임워크를 사용해서 API서버 만들기(3)

💡Today I Learned

  • 파이썬 장고 프레임워크를 이용한 API 서버 만들기의 세 번째 강의를 진행했습니다.
  • rest framework, serializer, rest/question~ url의 view를 구현하는 다양한 방법에 대한 이론 및 실습

 


 

1. Serializer

: Serialize = 모델 인스턴스나 QuerySet같은 데이터(딕셔너리 형태)를 API로 주고받기 위해서 JSON 형식의 파일로 변환하는 작업

: Deserialize = JSON 형식의 데이터를 정의된 포맷에 맞춰 다시 모델 인스턴스로 변환해 컴퓨터에 로딩하는 과정

: Serializer = Serialize, Deserialize 기능을 함

: 일반적으로 API 서버에서는 JSON 형식으로 데이터를 주고받음 

 

: django REST framework을 구현할 새로운 app(polls_api, polls의 기능을 api로 제공할 것임) 생성함

: Question의 Serializer 만들어 Field 정의, .create(), .update() 함수 구현

 

2. 장고 쉘에서 Serializer 사용하기

: JSONRenderer로 데이터 → JSON 인코딩된 형태 확인하기 (Serialize)

: json.loads()로 JSON  → 데이터 디코딩 + 모델에 load까지 (Deserialize)

 

a. Serialize

q = Question.objects.first()
serializer = QuestionSerializer(q)
json_str = JSONRenderer().render(serializer.data)

 

b. Deserialize

data = json.loads(json_str)
serializer = QuestionSerializer(data=data)
# json 데이터의 유효성 검사 먼저
serializer.is_valid()  #True
serializer.save # QuestionSerializer(data=data) 만 전달했으므로 .create() 함수가 호출됨
serializer.validated_data # 유효성 검사 후의 데이터 확인

 

c. serializer의 에러 확인

serializer.errors

 

 

*) 주의할 점: rest_framework ModulNotImport 에러 고치기

a. django-venv 가상환경 활성화된 상태에서 rest_framework 설치

pip install djangorestframework

 

b. mysite/settings.py에서 INSTALLED_APPS에 'rest_framework' 추가하기 (철자 주의!)

INSTALLED_APPS = [
	# ...
	'rest_framework',
]

 

c. cmd+shift+P로 파이썬 interpreter 설정 → 가상환경의 python[버전] 선택해주기

 

3. ModelSerializer

: serializers.ModelSerializer 상속받을 경우 메타데이터만 저장(model, fields)하면 create, update 모두 자동으로 생성돼 정상 동작!

 

4. GET

*) python decorator

: 함수나 클래스를 수정할 때 호출, 어떤 동작을 '꾸며주는' 형식

def NewDecorator(func): # 함수(func)를 입력으로 받는 함수(NewDecorator), 입력받는 함수에 따라 동작이 바뀔 수 있도록 함
	def NewAdd(*args, **kwargs):
    	print('Before call')
        result = func(*args, **kwargs) # add(1, 3) 호출 후 result에 4 저장
        print('After call')
        return result # 4 리턴
    return NewAdd

# 데코레이터의 이름 == 함수의 이름
@NewDecorator
def add(a, b): # 데코레이터의 입력은 'add'함수
	print('Our add function')
    return a+b
    
sum = add(1, 3) # 'Before call' 'Our add function' 'Aftercall')
print(sum) # 4

 

: @api_view()

a. HTTP 메소드 지원: API 뷰 함수를 특정 HTTP 메소드(get, post, put, delete etc..)에 연결 가능, HTTP 메소드 요청 처리하도록 views.py의 함수를 설정

b. 요청 유효성 검사: request 객체를 받아와서 이를 유효성 검사 & 인증, 권한 검사 처리 수행

c. 응답 생성: API 뷰 함수에서 response 객체를 생성하고 반환할 수 있음, API 앤드포인트에서 client에게 reponse 반환 가능

d. 예시

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def my_api_view(request):
    # GET 요청 처리 로직
    data = {'message': 'This is a GET request'}
    return Response(data)

 

 

5. HTTP 요청 메소드

: HTTP는 '요청 메소드'를 정의해서 주어진 리소스(question_조회, choice_투표)에 수행하기를 원하는 행동을 나타냄

: CRUD 동사: HTTP 메소드 = Create: POST, Read: GET, Update: PUT, Delete: DELETE

 

a. GET = 특정 리소스의 표시를 요청, GET을 사용하는 요청은 오직 데이터를 받기만

b. POST = 특정 리소스에 엔티티를 제출할 때 쓰임, '무언가 새로운 데이터를 만들어주세요' ex) 새로운 question, choice 생성

c. PUT = 특정 리소스를 payload로 바꿔라, 내용을 수정해달라는 업데이트 요청

d. DELETE = 특정 리소스를 삭제 요청

 

6. GET/POST/PUT/DELETE

: @api_view(['GET', 'POST', 'PUT', 'DELETE']) 로 POST 요청을 처리하는 부분 구현

: Response에 따른 status 지정해주기 (성공/실패_에러)

: HTTP Status Code

  1. 200번대: 정상적인 결과 (200 OK, 201 CREATED)
  2. 400번대: 사용자의 잘못된 요청 (400 BAD REQUEST ex: question_text 빈 채로 요청,, , 404 NOT FOUND)
  3. 500번대: 서버 내부의 오류

: request.data = 딕셔너리 형태의 데이터, deserialized

: serializer.data = JSON 형태의 데이터, serialized

 

7. Class 기반의 Views

: 6.에서 @api_view() 데코레이터(메소드)를 기반으로 한 view → APIView 클래스를 상속받은, 클래스 기반의 view

: urls.py 에서 'rest/question/'으로 들어오는 url에 대한 처리 역시 데코레이터 이용한 메소드 [APIView 클래스].as_view() 로 변경

 

8. Mixin

: APIView 클래스 상속으로 view 구현 Mixin, GenericView 클래스 상속해서 좀 더 간편하게 view 구현

: APIView 클래스보다 구현이 더 간단해짐

 

a. GET: ListModelMixin, RetrieveModelMixin

b. PUT: UpdateModelMixin

c. POST: CreateModelMixin

d. DELETE: DestroyModelMixin

 

9. Generic API View

: Generics 클래스로 view 구현 더더 간단하게..!

*) class 이름 + cmd 클릭 → 클래스 구현 정보 확인 (Mixin의 클래스들을 이미 상속받아 구현돼있음)

반응형