Web framework for developing RESTful APIs in Python
- Pydantic 및 유형 힌트를 기반으로 데이터를 검증, 직렬화 및 역직렬화하고 OpenAPI 문서를 자동으로 생성합니다.
The key features are:
.
└── FastAPI
├── * database.py
├── * models.py
├── schemas.py
├── * crud.py
├── * main.py
└── __init__.py
SQLAlchemy : python 에서 사용가능한 ORM 라이브러리 (≒ JS - TypeORM)
engine = create_engine(DB_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
from .database import Base
class reviews(Base):
# SQLAlchemy의 테이블 이름
__tablename__ = "reviews"
id = Column(Integer, primary_key=True, index=True)
platform = Column(String)
rating = Column(Integer)
content = Column(String)
time = Column(DateTime)
# 이 Session을 통해 db라는 파라미터를 만들고 데이터베이스와 소통할 수 있다.
from sqlalchemy.orm import Session
# models.py : SQLAlchemy model들
# schemas.py : Pydantic models / schemas
import models, schemas
def get_reviews(db: Session, store_id, start, end):
# 지정된 기간 내 플랫폼별 리뷰 조회
reviews = db.query(models.reviews).filter(between(models.reviews.time, start, end)).all()
#...생략
return_json = {"daily_count" : daily_count, "all_count" : all_count}
return return_json
와일드카드
"*"
("와일드카드")로 선언할 수 있음CORSMiddleware
사용
CORSMiddleware
임포트.origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
models.Base.metadata.create_all(bind=engine)
dependency + yield 조합을 통하여 리퀘스트에서 db세션을 생성하고 response 시 DB를 종료하도록 코드를 작성한다
참고 Link
FastAPI에서는 yield를 사용하여 dependency 가 끝나면 몇가지 작업을 수행할 수 있다.
async def get_db():
db = DBSession()
try:
yield db
finally:
db.close()
Middleware vs Dependency + yield
마지막 이유로 미들웨어에 db를 쓰지말고 Dependency + yield 조합을 사용하자
디펜던시로 사용할때 자료형을 db의 자료형을 Session으로 지정해 준다.
마지막으로 path operation을 구현시켜주면 된다.
@app.get("/")
async def get_products(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
products = crud.get_products(db, skip=skip, limit=limit)
return products
http://127.0.0.1:8000/reviews?storeId=0&startDate=20221201&endDate=20231201
# main.py
@app.get("/reviews")
async def get_reviews(storeId: int = 0, startDate: int = 20221201, endDate: int = 20230101, db: Session = Depends(get_db)):
products = crud.get_reviews(db, store_id=storeId, start=startDate, end=endDate)
return products
공식문서
https://fastapi.tiangolo.com/
공식문서 번역
https://lucky516.tistory.com/109
https://mumin-blog.tistory.com/338
https://jongsky.tistory.com/17
Debug Issue
https://fastapi.tiangolo.com/tutorial/debugging/
https://incomeplus.tistory.com/187
CRUD 구현 시 참고
https://breezymind.com/fastapi-crud-api/