FastAPI, CRUD API 예제 

 

글. 수알치 오상문

 

 

 

[예제] main.py

from fastapi import FastAPI, status  # Response
from fastapi.exceptions import HTTPException
from pydantic import BaseModel
from typing import List, Literal

app = FastAPI()

users = [
    {
     'low_id': 1,
     'user_id': 'user1',
     'name': 'Sualchi',
     'age': 30,
     'gender': 0,
     'mobile': '01011112222'
    },
    {
     'low_id': 2,
     'user_id': 'user2',
     'name': 'Maria',
     'age': 31,
     'gender': 1,
     'mobile': '01011113333'
    },  
]


class IdGenerator:
  def __init__(self, last_id_number):
    self.user_last_id = last_id_number

  def get_new_id(self):
    self.user_last_id += 1
    return self.user_last_id

id_gen = IdGenerator(len(users))  # 기존 id 번호 최종 값으로 초기화
id_make = id_gen.get_new_id

class User(BaseModel):
    low_id : int
    user_id : str
    name : str
    age : int
    gender : Literal[0, 1, 2]  # 남자 0, 여자 1, 모름 2
    mobile : str    

class CreateUser(BaseModel):    
    user_id : str
    name : str
    age : int
    gender : Literal[0, 1, 2]  # 남자 0, 여자 1, 모름 2
    mobile : str    

class UpdateUser(BaseModel):        
    name : str
    age : int
    gender : Literal[0, 1, 2]  # 남자 0, 여자 1, 모름 2
    mobile : str 


@app.get("/users", response_model=List[User])  # status_code 사용 시 오류 발생
async def get_all_users():
    """ 모든 사용자 정보 리스트를 돌려준다. """
    return users


@app.get("/user/{low_id}")
async def get_user(low_id: int) -> dict:
    """ 특정 사용자 정보를 돌려준다. """ 
    for user in users:
        if user['low_id'] == low_id:
            return user
    # raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="User not found")
    raise HTTPException(status_code=404, detail="User not found")

@app.get("/user/{low_id}")
async def get_user(low_id: int) -> dict:
  """ 특정 사용자 정보를 돌려준다. """ 
  for user in users:
    if user['low_id'] == low_id:
      return user  
    
  raise HTTPException(status_code=404, detail="User not found")  


@app.post("/user", status_code=status.HTTP_201_CREATED)
async def create_user(new_data: CreateUser) -> dict:
    """ 사용자를 새로 등록한다. """
    new_user = new_data.model_dump()
    new_user['low_id'] = id_make()  # 신규 id 
    users.append(new_user) 
    return new_user


@app.patch("/user/{low_id}")
async def update_user(low_id: int, update_data: UpdateUser) -> dict:
    " 특정 사용자 정보를 갱신한다."
    update_user = update_data.model_dump(exclude_unset=True)  # 값이 설정되지 않은 필드 제외 
    print(update_user)
    for user in users:
        if user["low_id"] == low_id:            
            user.update(update_user)  # 딕셔너리 업데이트
            return user
        
    raise HTTPException(status_code=404, detail="User not found")


@app.delete("/user/{low_id}", status_code=status.HTTP_200_OK)
async def delete_user(low_id: int):
    """ 특정 사용자를 제거한다 """
    for user in users:
        if user["low_id"] == low_id:
            users.remove(user)
            return {"status": "OK", "message": "User is deleted"} 
    
    raise HTTPException(status_code=404, detail="User not found")​

 

[실행] 

uvicorn main:app --reload --port 80

 

[화면] http://127.0.0.1:80

 

 

반응형

+ Recent posts