💡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
- 200번대: 정상적인 결과 (200 OK, 201 CREATED)
- 400번대: 사용자의 잘못된 요청 (400 BAD REQUEST ex: question_text 빈 채로 요청,, , 404 NOT FOUND)
- 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의 클래스들을 이미 상속받아 구현돼있음)
'데브코스 > TIL' 카테고리의 다른 글
[TIL] 4주차_Day15: Django 프레임워크를 사용해서 API서버 만들기(5) (3) | 2023.11.06 |
---|---|
[TIL] 4주차_Day14: Django 프레임워크를 사용해서 API서버 만들기(4) (0) | 2023.11.06 |
[TIL] 4주차_Day12: Django 프레임워크를 사용해서 API서버 만들기(2) (1) | 2023.11.03 |
[TIL] 4주차_Day11: Django 프레임워크를 사용해서 API서버 만들기(1) (0) | 2023.11.02 |
[TIL] 3주차_Day10: 파이썬 웹 크롤링(5) (1) | 2023.11.01 |