Python Fast API 개발환경 세팅 및 API 생성 예시

beluga000·2024년 8월 7일
0
post-thumbnail

Python Fast API

FastAPI는 현대적인, 빠르고 (high-performance), Python 기반 웹 프레임워크입니다. Starlette와 Pydantic을 기반으로 하며, ASGI 표준을 따릅니다. FastAPI는 API 개발을 빠르고 쉽게 할 수 있게 해주며, 다음과 같은 주요 특징들이 있습니다.

  1. 고성능: Uvicorn을 ASGI 서버로 사용하여 매우 높은 성능을 자랑합니다. Uvicorn은 비동기 지원과 높은 동시성을 제공합니다.

  2. 자동 문서화: Swagger UI와 ReDoc을 통해 자동으로 API 문서를 생성합니다.

  3. 타입 힌팅: Python 타입 힌팅을 사용하여 자동으로 요청 데이터의 검증 및 변환을 수행합니다.

  4. 쉬운 사용성: 개발자가 사용하기 쉽고 직관적입니다. FastAPI는 빠른 개발을 지원합니다.

  5. 비동기 지원: 비동기 프로그래밍을 지원하여 높은 동시성을 제공합니다.

Fast API 세팅

먼저 Fast api와 Uvicorn을 설치합니다.

pip install fastapi uvicorn

이후 프로젝트 디렉토리 구조를 설정합니다.

fastapi_project/
├── app/
│   ├── __init__.py
│   ├── crud.py
│   ├── database.py
│   ├── main.py
│   ├── models.py
│   └── schemas.py
└── requirements.txt

requirements.txt 파일을 생성하고 필요한 패키지를 추가합니다.

fastapi
uvicorn
pydantic
motor

MongoDB와 연동하여 데이터를 조회하고 추가하는 API를 생성하도록 하겠습니다.

MongoDB의 local에 products 컬렉션에 2개의 데이터를 생성한 이후 프로젝트에 코드를 추가합니다.

models.py

from pydantic import BaseModel

class Product(BaseModel):
    id: str
    name: str
    description: str
    price: float
    quantity: int

crud.py

from app.schemas import ProductCreate
from bson import ObjectId

async def create_product(db, product: ProductCreate):
    product_dict = product.dict()
    result = await db.insert_one(product_dict)
    product_dict["id"] = str(result.inserted_id)
    return product_dict

async def get_products(db, skip: int = 0, limit: int = 10):
    products = await db.find().skip(skip).limit(limit).to_list(length=limit)
    for product in products:
        product["id"] = str(product["_id"])
    return products

async def get_product_by_id(db, product_id: str):
    product = await db.find_one({"_id": ObjectId(product_id)})
    if product:
        product["id"] = str(product["_id"])
    return product

schemas.py

from pydantic import BaseModel

class ProductBase(BaseModel):
    name: str
    description: str
    price: float
    quantity: int

class ProductCreate(ProductBase):
    pass

class ProductResponse(ProductBase):
    id: str

    class Config:
        orm_mode = True

database.py

from motor.motor_asyncio import AsyncIOMotorClient

MONGO_DETAILS = "mongodb://localhost:27017"

client = AsyncIOMotorClient(MONGO_DETAILS)
database = client.local  # local 데이터 베이스 사용
products_collection = database.get_collection("products")  # products 컬렉션 연결

async def get_db():
    yield products_collection

main.py

from fastapi import FastAPI, Depends, HTTPException
from app.database import get_db
from app.schemas import ProductCreate, ProductResponse
from app.crud import create_product, get_products, get_product_by_id

app = FastAPI()

@app.get("/")
def read_root():
    return {"Start": "Python Fast API"}

@app.post("/products_insert/", response_model=ProductResponse)
async def create_product_endpoint(product: ProductCreate, db = Depends(get_db)):
    return await create_product(db, product)

@app.get("/products/", response_model=list[ProductResponse])
async def read_products(skip: int = 0, limit: int = 10, db = Depends(get_db)):
    return await get_products(db, skip=skip, limit=limit)

@app.get("/products/{product_id}", response_model=ProductResponse)
async def read_product(product_id: str, db = Depends(get_db)):
    product = await get_product_by_id(db, product_id)
    if product is None:
        raise HTTPException(status_code=404, detail="Product not found")
    return product

위 처럼 각 파일들을 세팅한 이후 Fast API 서버를 실행합니다.

서버 실행 명령어

uvicorn app.main:app --reload

서버 실행 이후 localhost:8000으로 접속하면 위와 같은 화면을 확인할 수 있습니다.

이후 localhost:8000/docs로 접속하여 Swagger UI를 통해 엔드포인트를 테스트해보도록 하겠습니다.

localhost:8000/docs로 접속하면 위와 같은 화면을 확인할 수 있습니다.
해당 페이지에서 위에서 작성한 API를 테스트 하겠습니다.

  1. (GET) products 컬렉션 데이터 조회 API - /products

Try it out 버튼을 클릭하여 해당 API를 호출합니다.

위와 같이 products 컬렉션의 데이터가 조회되는 것을 확인할 수 있습니다.

  1. (POST) products 컬렉션 데이터 삽입 API - /products_insert


첫번째 테스트와 동일하게 Try it out 버튼을 클릭한 이후 추가할 데이터를 model에 맞게 작성한 이후 테스트하면 아래와 같습니다.


테스트에서 추가한 apple 데이터가 products 컬렉션에 추가된 것을 확인할 수 있습니다.

이처럼 Fast API를 사용하면 API 작업이 간편하고 쉬운 편에 속합니다.

profile
Developer

0개의 댓글