FastAPI의 라우팅과 요청 처리는 Starlette 기반으로 동작함
HTTP Methods
GET /users -> 사용자 조회POST /users -> 사용자 생성PUT /users/1 -> 사용자 전체 수정PATCH /users/1 -> 사용자 일부 수정DELETE /users/1 -> 사용자 삭제from fastapi import FastAPI
app = FastAPI()
@app.get("/users")
def get_users():
return {"users": ["Kim", "Lee"]}
from fastapi import FastAPI
app = FastAPI()
@app.post("/users")
def create_user(name: str, age: int):
return {
"name": name,
"age": age
}
# 요청
POST /users?name=Kim&age=25
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class UserCreate(BaseModel):
name: str
age: int
@app.post("/users")
def create_user(user: UserCreate):
return user
# 요청
{
"name": "Kim",
"age": 25
}
# 잘못된 요청
{
"name": "Kim",
"age": "hello"
}
422 Unprocessable Entity
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class UserUpdate(BaseModel):
name: str
age: int
email: str
@app.put("/users/{user_id}")
def update_user(user_id: int, user: UserUpdate):
return {
"user_id": user_id,
"user": user
}
PUT /users/1
{
"name": "Kim",
"age": 25,
"email": "kim@test.com"
}
# PUT /users/1 요청 Body
{
"name": "Lee"
}
from fastapi import FastAPI
from pydantic import BaseModel
from typing import Optional
app = FastAPI()
class UserUpdate(BaseModel):
name: Optional[str] = None
age: Optional[int] = None
email: Optional[str] = None
# name: str | None = None
# age: int | None = None
# email: str | None = None
@app.patch("/users/{user_id}")
def update_user(user_id: int, user: UserUpdate):
update_data = user.model_dump(exclude_unset=True)
return {
"user_id": user_id,
"update_data": update_data
}
typing의 Optional 사용typing 모듈OptionalOptional은 값이 전달되지 않아도 에러가 발생하지 않도록 하기 위해 사용 name: Optional[str] = None은 str이거나 None이 가능(에러 X)name: str | None = None식으로도 작성 가능None과 unsetNonenull을 명시적으로 보냄unsetupdate_data = user.model_dump(exclude_unset=True)
model_dumpexclude_unsetPATCH /users/1
{
"age": 30
}
age만 수정되고 name, email은 유지됨from fastapi import FastAPI
from fastapi import status
from fastapi.responses import Response
app = FastAPI()
@app.delete("/users/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_user(user_id: int):
return
DELETE /users/1
{
"message": "deleted"
}
204 No Content
204 No Content를 사용하여 응답 Body없이 처리하는 것이 일반적이며 필요한 경우 메시지와 함께 반환하기도 함