Python/Backend

FastAPI get, post, patch, delete 예제 코드 정리

jimmy_AI 2024. 4. 24. 01:09
반응형

파이썬의 대표 백엔드 모듈인 FastAPI에서

get, post, patch, delete 메소드를 구현하는 방법을

간단한 예제를 통하여 정리해보도록 하겠습니다.

 

 

get 메소드 예시

간단한 유저 데이터를 저장하는 상황을 가정해보고,

먼저 전체 유저의 정보를 가져오는 코드를 작성해보도록 하겠습니다.

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List

app = FastAPI()

# 데이터베이스 역할을 할 간단한 딕셔너리
db = {}

# 데이터 모델 정의
class User(BaseModel):
    id: int
    username: str
    email: str

# 전체 유저의 정보들을 리스트로 반환
@app.get("/users", response_model=List[User])
def read_users():
    return list(db.values())

 

서버 주소/users 형태의 전체 url을 통하여

전체 유저의 정보를 리스트로 쉽게 가져올 수 있습니다.

 

이를 서버 주소/users/id 형태로 특정 id에 해당하는 한 명의 유저 정보를 가져오는

예시로 변형하면 다음과 같습니다.

# 특정 id를 가진 1명의 정보만 가져오기, id가 없다면 404 에러 반환 가정
@app.get("/users/{user_id}", response_model=User)
def read_user_by_id(user_id: int):
    for user in db.values():
        if user.id == user_id:
            return user
    raise HTTPException(status_code=404, detail="User not found")

 

위의 메소드들은 requests 모듈로 아주 간단하게 호출이 가능합니다.

import requests

url_all = "http://127.0.0.1:8000/users" # url 가정(전체 유저 조회)
url_one = "http://127.0.0.1:8000/users/1" # url 가정(id 1번 유저 조회)

response_all = requests.get(url_all)
response_one = requests.get(url_one)

 

 

post 메소드 예시

유저 id를 기준으로 새로운 유저 정보를 추가하는 post 메소드를 구현한 예시는

다음과 같이 정리해볼 수 있습니다.

# user id를 기준으로 새로운 유저 데이터 추가, 단 이미 id가 존재하면 400 에러 반환 가정
@app.post("/users", response_model=User)
def create_user(user: User):
    if user.id in db:
        raise HTTPException(status_code=400, detail="User ID already registered")
    db[user.id] = user
    return user

 

위의 방법으로 구현한 메소드는 requests 모듈에서 다음과 같이 수행이 가능합니다.

import requests

url = "http://127.0.0.1:8000/users" # url 가정
user_data = {
    "id": 1,
    "username": "jimmy",
    "email": "jimmy@example.com"
}
response = requests.post(url, json=user_data)

 

 

patch 메소드 예시

이번에는 특정 id에 해당하는 유저의 정보(이름 or 이메일)을 변경하는

patch 메소드에 대한 구현 예시를 살펴보도록 하겠습니다.

이에 대한 구현을 위하여 새롭게 import된 클래스들에 유의해주세요.

(username or email은 수정할 값만 선택적으로 보낼 수 있습니다.)

from fastapi import FastAPI, HTTPException, Body
from pydantic import BaseModel, Field
from typing import Optional

# id를 기준으로 username 혹은 email 정보 수정, 단 id가 존재하지 않았다면 404 에러 반환 가정
@app.patch("/users/{user_id}", response_model=User)
def update_user(user_id: int, username: Optional[str] = Body(default=None), email: Optional[str] = Body(default=None)):
    if user_id not in db:
        raise HTTPException(status_code=404, detail="User not found")
    
    user = db[user_id]
    # username / email이 input으로 안 들어오면 해당 값 변경 X
    if username is not None:
        user.username = username
    if email is not None:
        user.email = email

    db[user_id] = user
    return user

 

위 메소드를 활용하는 requests 모듈 코드 예시는 다음과 같습니다.

import requests

url = "http://127.0.0.1:8000/users/1" # id = 1인 유저 정보 수정 예시

# 보낼 데이터 설정
data = {
    "username": "new_name", 
    "email": "new_email@example.com" 
}

response = requests.patch(url, json=data)

 

 

delete 메소드 예시

마지막으로 유저 id를 기준으로 특정 유저의 정보를 삭제하는 delete 메소드

구현해보도록 하겠습니다. 코드 스니펫은 다음과 같습니다.

# user id 기준으로 데이터 삭제, 단 존재하지 않았던 id라면 404 에러 반환 가정
@app.delete("/users/{user_id}", response_model=User)
def delete_user(user_id: int):
    if user_id not in db:
        raise HTTPException(status_code=404, detail="User not found")
    
    return db.pop(user_id)

 

delete에 대한 requests 모듈 호출 예제는 다음과 같이 간단하게 정리해볼 수 있습니다.

import requests

url = "http://127.0.0.1:8000/users/1" # id = 1인 유저 정보 삭제 예시

response = requests.delete(url)