직관적인 디자인
path, query, body, response, dependency
Type Hints
Pydantic , Data validation , IDE Support
비동기처리
AsynclO, Background Task
자동 API 문서 생성
OpenAPI, SwaggerUI
REST : Representational State Transfer
Resource : URL를 통해 고유한 리소스 표현
예시 /api/v1/posts
/api/v1/posts/123/comments
Method : HTTP Method 통해 API의 동작 표현
2xx
4xx
5xx
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')
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)
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})'