시작에 앞서
해당 내용은 <가장 빠른 풀스택을 위한 Flask & FastAPI>, Dave Lee 지음. BJ Public 출판.
내용을 토대로 작성되었습니다. 보다 자세한 사항은 해당 교재를 참고하시기 바랍니다.
이전 내용
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 (파이단틱)
★ 파이단틱과 관련된 보다 상세한 내용은 하단 링크 참고
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"
다음 내용
'[파이썬 Projects] > <파이썬 웹개발>' 카테고리의 다른 글
[파이썬] FastAPI - Pydantic (2) (0) | 2024.08.17 |
---|---|
[파이썬] Pydantic: 데이터 검증 라이브러리 (0) | 2024.08.17 |
[파이썬] FastAPI - 타입 힌트(Type hint) (0) | 2024.08.17 |
[파이썬] FastAPI - 라우팅 (0) | 2024.08.17 |
[파이썬] FastAPI 기초 (0) | 2024.08.15 |