TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 웹개발>

[파이썬] FastAPI - HTTP 메서드, Pydantic

by 기록자_Recordian 2024. 8. 17.
728x90
반응형
시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.

이전 내용
 

[파이썬] FastAPI - 타입 힌트

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용 [파이썬] FastAPI - 라우팅시작에 앞서해당

puppy-foot-it.tistory.com


HTTP 메서드

 

HTTP 메서드는 클라이언트가 서버에게 어떤 동작을 해달라고 요청하는 방식을 정의한다.

FastAPI는 이러한 메서드를 사용하여 요청의 의도를 명확히 하고, 적절한 엔드포인트에 연결하는 라우팅을 수행한다.

 

[HTTP 메서드 종류]

  • GET: 이 메서드는 서버로부터 정보를 요청할 때 사용한다. 데이터를 가져오는 read-only 작업에 적합하며, 서버의 상태나 데이터를 변경하지 않는다. (상요자의 프로필 데이터나 게시글 목록을 가져올 때 등)
  • POST: 서버에 데이터를 전송하여 새로운 리소스를 생성하려고 할 때 사용한다. (새 사용자 등록, 게시글 등록할 때 등) POST 요청은 데이터를 서버의 특정 경로에 제출하며, 해당 데이터는 주로 요청 바디에 포함된다.
  • PUT: 지정된 리소스의 전체 업데이트를 수행한다. (사용자의 전체 프로필 업데이트 등) PUT은 리소스가 존재하지 않는 경우 새로 생성할 수 있지만, 주로 기존 리소스의 완전한 교체를 의미한다.
  • DELETE: 지정된 리소스를 삭제할 때 사용한다. 이 요청은 서버에 리소스의 제거를 지시하며, 성공적으로 처리된 경우 리소스에 더 이상 접근할 수 없다. (사용자가 자신의 계정 삭제, 작성한 게시글 삭제 등)

▶ FastAPI를 사용하면 이러한 메서드를 각각의 라우팅 데코레이터(@app.get(), @app.post(), @app.put(), @app.delete() 등)와 함께 사용하여 다양한 HTTP 요청을 처리하는 API를 손쉽게 구성할 수 있다.


Fast API: HTTP 메서드 코드 작성

 

from fastapi import FastAPI #FastAPI 라이브러리 import

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI"}

@app.get("/items/{item_id}")
def read_item(item_id: int):
	return {"item_id": item_id}

@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
	return {"skip": skip, "limit": limit}

@app.post("/items/")
def create_item(item: dict):
	return {"item": item}

@app.put("/items/{item_id}")
def update_item(item_id: int, item: dict):
	return {"item_id": item_id, "updated_item": item}

@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    return {"message": f"Item {item_id} has been deleted"}

# 실행: uvicorn main:app --reload

 

코드 작성 후, 터미널에서 하단 명령어를 입력하여 실행

uvicorn main:app --reload

curl을 사용한 테스트

 

◆ POST 메서드

curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d "{\"name\":\"item1\", \"value\":42}"

 

◆ PUT 메서드

아이템 ID가 1인 아이템의 정보를 업데이트

curl -X PUT "http://127.0.0.1:8000/items/1" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"name\": \"updated_item\", \"value\": 43}"

 

◆ DELETE 메서드

아이템 ID가 1인 아이템 삭제

curl -X DELETE "http://127.0.0.1:8000/items/1" -H "accept: application/json"


Pydantic (파이단틱)

 

★ 파이단틱과 관련된 보다 상세한 내용은 하단 링크 참고

 

[파이썬] Pydantic: 데이터 검증 라이브러리

Pydantic이해하기 쉬운 Pydantic: 데이터 유효성 검사와 데이터 모델링의 새로운 기준  Pydantic은 Python에서 가장 널리 사용되는 데이터 검증 라이브러리이다.Pydantic은 Python의 데이터 유효성 검

puppy-foot-it.tistory.com


FastAPI에서 Pydantic(파이단틱) 은 데이터 검증과 직렬화를 매우 쉽게 만들어준다.

 

[데이터 검증, 데이터 직렬화]

  • 데이터 검증(data validation): 사용자나 다른 시스템이 보내는 데이터가 올바른 형식과 값인지 확인하는 과정. 데이터 검증을 통해 잘못된 정보를 사전에 차단할 수 있다. (예. 금액 입력 시 문자열 입력 방지)
  • 데이터 직렬화(data serialization): 복잡한 데이터 구조를 바이트나 문자열로 변환해서 다른 시스템과 쉽게 데이터를 교환할 수 있는 형태로 만드는 것. ↔ 역직렬화: 문자열이나 바이트를 원래의 데이터 구조로 되돌리는 것

[데이터 검증, 데이터 직렬화가 필요한 이유]

  • 데이터 검증: 잘못된 데이터가 처리되는 것을 막아서 버그나 다양한 문제 예방
  • 데이터 직렬화: 서로 다른 시스템끼리 데이터를 쉽게 주고 받을 수 있게 해준다

▶ 데이터 요청을 위해 자주 사용하는 HTTP POST 메서드는 데이터를 요청 바디에 넣어서 전송하므로, POST 메서드로 API를 선언하는 경우에는 Pydantic 모델 사용을 고려할 필요가 있다.

 

◆ Pydantic 모델 적용의 예

Item 클래스가 Pydantic 모델이며, 이 모델은 name, price, is_offer 라는 세 가지 필드를 가진다.

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

@app.post("/items/")
def create_item(item: Item):
	return {"item": item.dict()}

 

위 코드를 저장 및 실행 한 후, curl로 POST 메서드를 테스트 해 본다.

curl -X POST "http://127.0.0.1:8000/items/" -H "accept:application/json" -H "Content-Type:application/json" -d "{\"name\": \"Bread\", \"price\": 3.5, \"is_offer\": true}"

 

Price를 문자열로 보내면 FastAPI가 자동으로 에러를 반환한다.

curl -X POST "http://127.0.0.1:8000/items/" -H "accept:application/json" -H "Content-Type:application/json" -d "{\"name\": \"Bread\", \"price\": \"invalid\", \"is_offer\": true}"

"Input should be a valid number, unable to parse string as a number","input":"invalid","url":"https://errors.pydantic.dev/2.8/v/float_parsing"


다음 내용

 

[파이썬] FastAPI - Pydantic (2)

시작에 앞서해당 내용은 , Dave Lee 지음. BJ Public 출판.내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.이전 내용 [파이썬] FastAPI - HTTP 메서드, Pydantic시작에

puppy-foot-it.tistory.com

 

728x90
반응형