Developer's Development

3.4.10 [Django] Fast API (RESTful API) 본문

AI 활용 애플리케이션 개발/Django Framework

3.4.10 [Django] Fast API (RESTful API)

mylee 2025. 10. 28. 16:42
Rest API

 

REST(Represential State Transfer)는 API 작동 방식에 대해 조건을 부과하는 소프트웨어 아키텍처를 의미한다.

REST는 처음 인터넷과 같은 복잡한 네트워크에서 통신을 관리하기 위한 지침으로 만들어졌다.

자원을 정의하고, 자원에 대한 주소를 지정하여, 별도의 전송 계층 없이 전송하기 위한 인터페이스를 의미한다.

 

 

Fast API

 

cmd

(django_env) C:\skn_17\back_end>pip install fastapi uvicorn

 

fast_api/01_hello.py 생성

from fastapi import FastAPI 

app = FastAPI() 

@app.get("/")
async def root():
    return {"message": "Hello FastAPI World"}

# GET /hello -> {"message": "Hello?"}
@app.get("/hello/{name}")
async def say_hello(name: str):
    return {"message": f"Hello? {name}!"}

 

cmd

cd fast_api
uvicorn 01_hello:app --reload

 

fast_api/test_fast_api.http 생성 후 Send Request

GET http://127.0.0.1:8000
Accept: application/json

###

GET http://127.0.0.1:8000/hello/maenggu
Accept: application/json

 

 

  • Path Variable, Query String, Request Body

fast_api/main.py 생성

from fastapi import FastAPI
from path_params import router as path_params_router
from query_params import router as query_params_router
from request_body import router as request_body_router

app = FastAPI()

app.include_router(router=path_params_router)
app.include_router(router=query_params_router)
app.include_router(router=request_body_router)

 

fast_api/path_params.py 생성

from fastapi import APIRouter

router = APIRouter(prefix='/path_params', tags=['path_params'])

@router.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

"""
경로 작동은 순차적으로 실행됨
"""

@router.get("/users/me")
async def read_user_me():
    return {'user_id': "current user == me"}

@router.get("/users/{user_id}")
async def read_user(user_id: str):
    return {'user_id': {user_id}}

 

fast_api/query_params.py 생성

from fastapi import APIRouter

router = APIRouter(prefix='/query_params', tags=['query_params'])

fake_item_db = [{"item_name": "김밥"}, {"item_name": "떡볶이"}, {"item_name": "순대"}]

@router.get('/items')
async def read_item(skip: int = 0, limit: int = 0):
    return fake_item_db[skip : skip+limit]

@router.get('/products/{product_id}')
async def read_product(product_id: str, q: str | int = None):
    if q:
        return {"product_id": product_id, "q": q}
    return {"product_id": product_id}

 

fast_api/request_body.py 생성

from fastapi import APIRouter
from pydantic import BaseModel	# 데이터 검증

router = APIRouter(prefix='/request_body', tags=['request_body'])

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float
    tax: float | None = None

@router.post('/items')
async def create_item(item: Item):
    return item

# Path Variable, QueryString Parameters, Request Body를 섞어 사용해도 잘 구분함
@router.put('/items/{item_id}')
async def update_item(item_id: int, item: Item, q: str | None = None):
    result = {"item_id": item_id, **item.model_dump()}
    if q:
        result.update({"q": q})
    return result

 

cmd

uvicorn main:app --reload

 

fast_api/test_fast_api.http 코드 추가 후 Send Request

###

GET http://127.0.0.1:8000/path_params/items/123
Accept: application/json

###

GET http://127.0.0.1:8000/path_params/users/me
Accept: application/json

###

GET http://127.0.0.1:8000/query_params/items?skip=0&limit=2
Accept: application/json

###

GET http://127.0.0.1:8000/query_params/products/123?q=test
Accept: application/json

###

POST http://127.0.0.1:8000/request_body/items
Content-Type: application/json

{
    "name": "MacBook Pro",
    "description": "M3 Pro 14인치",
    "price": 2999.99,
    "tax": 300
}

###

PUT http://127.0.0.1:8000/request_body/items/123?q=hello
Content-Type: application/json

{
    "name": "MacBook Pro",
    "description": "M3 Pro 14인치",
    "price": 2999.99,
    "tax": 300
}​