FastAPI

짬그브·2025년 6월 2일

FastAPI

직관적인 디자인
path, query, body, response, dependency

Type Hints
Pydantic , Data validation , IDE Support

비동기처리
AsynclO, Background Task

자동 API 문서 생성
OpenAPI, SwaggerUI

RESTful API

REST : Representational State Transfer

Resource : URL를 통해 고유한 리소스 표현
예시 /api/v1/posts
/api/v1/posts/123/comments

Method : HTTP Method 통해 API의 동작 표현

Status code

2xx

  • 200 OK 요청 성공, 범용적
  • 201 Created 요청 성공, 새로운 자원 생성
  • 204 No Content 요청 성공, 응답할 자원 없음

4xx

  • 400 Bad Request 요청 실패, 요청이 잘못된 경우
  • 401 Unauthorized 인증 실패
  • 403 Forbidden 권한 문제 또는 잘못된 method
  • 404 Not Found 자원이 없는 경우 또는 잘못된 endpoint

5xx

  • 500 Internal Server Error 범용적인 서버 에러
  • 502 Bad Gateway : Reverse Proxy에서 서버의 응답을 처리할 수 없는 경우
  • 503 Service Unavaliable 서버가 요청을 처리할 수 없는 경우

라이브러리 설치

pip install fastapi

pip install uvicorn

pip install sqlalchemy

pip install pymysql

실행방법

터미널에서 실행

docs 실행시


예제 코드

from fastapi import FastAPI , Body, HTTPException
from pydantic import BaseModel

app = FastAPI()

@app.get('/')
def cd_check_handler():
    return {'name':'kim'}

todo_data = {
    1:{
        'id':1,
        'contents':'fastAPI 섹션1',
        'is_done':True
    },
    2:{
        'id':2,
        'contents':'fastAPI 섹션2',
        'is_done':False
    },
    3:{
        'id':3,
        'contents':'fastAPI 섹션3',
        'is_done':False
    },
}

@app.get('/todos')
def get_todos_handler(order=None):
    ret = list(todo_data.values())
    if order and order == 'DESC':
        return ret[::-1]
    return ret

@app.get('/todos/{todo_id}', status_code=200)
def get_todo_handler(todo_id:int):
    todo = todo_data.get(todo_id)
    if todo:
        return todo
    raise HTTPException(status_code=404, detail='todo not found')

class CreateToDoRequest(BaseModel):
    id:int
    contents:str
    is_done:bool


@app.post('/todos', status_code=201)
def create_todo_handler(request:CreateToDoRequest):
    todo_data[request.id] =request.model_dump()
    return todo_data[request.id]


@app.patch('/todos/{todo_id}', status_code=200)
def update_todo_handler(
        todo_id:int,
        is_done:bool = Body(..., embed=True) #json 형태로 요청
):
    todo = todo_data.get(todo_id)
    if todo:
        todo['is_done'] = is_done
        return todo
    raise HTTPException(status_code=404, detail='todo not found')

@app.delete('/todos/{todo_id}', status_code=204)
def delete_todo_handler(todo_id:int):
    todo = todo_data.pop(todo_id, None)
    if todo:
        return
    raise HTTPException(status_code=404, detail='todo not found')



sql 데이터 연결

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

DATABASEURL = "mysql+pymysql://root:mysql80!@127.0.0.1:3306/todos"

engine = create_engine(DATABASEURL, echo=True)
SessionFactory = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# session = SessionFactory()
# from sqlalchemy import select
# print(session.scalar(select(1)))

from sqlalchemy import select
from day1.database.orm import ToDo

session = SessionFactory()
print(list(session.scalars(select(ToDo))))
print()

todos=list(session.scalars(select(ToDo)))
for todo in todos:
    print(todo)

orm

from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Boolean, Integer, String

Base = declarative_base()

class ToDo(Base):
    __tablename__ = 'todo'

    id = Column(Integer, primary_key=True, index=True)
    contents = Column(String(256), nullable=False)
    is_done = Column(Boolean, nullable=False)

    def __repr__(self):
        return f'ToDo(id={self.id}, contents={self.contents}, is_done={self.is_done})'
profile
+AI to AI+

0개의 댓글