ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastAPI 로 router 구현하기
    Backend/FastAPI 2023. 6. 26. 21:38

    필자는 mvc 패턴 구조를 기반으로 할 때, 동일한 이름의 파일명으로 통일해준다.

    (오른쪽 그림 참고)

     

    <간략한 구조 설명 >

     

    만약 food.py 중 하나의 API를 수정해야 한다고 가정하자. 이때, response model 의 타입 변경을 위해서 model속 food.py만 수정하면 되는 편리함(?) 이 있다. -> 유지 보수 편리! 

     

    -> 특히, 서로 서로 참고할 때(from model import food 와 같이 가독성 및 이해하기 쉬움 )

     

     

    그리고, router속의 여러가지 api들은  api.py 에 묶어서 main.py의 미들웨어에서 사용 예정이다!

     

     

     

     

     

     

     

     

    본격적으로 API를 하나 만들어 보자! 

    (보통, 화면 설계서를 바탕으로 API 명세서를 작성 후 API를 만든다!)

     

     

    1. query string 을 사용 할 때

     

    # router 속의 food.py에서 작성됨
     
     
    from fastapi import APIRouter, HTTPException, status
    from typing import Union, List, Dict
    from common.exception import *

    from controller import food as ctrl_food

    from model import food

    router = APIRouter()


    @router.get('/{name}')
    def get_name(name:str):
        return {'Introduce': f"Hi, my name is {name}"}
     
     

     

    위를 실행 후, 127.0.0.1:8000/docs에서 확인 올바르게 만들었는지 확인 가능

     

    (그 전에 try it out 꼭 클릭하기)

     

    그리고 name에 sue를 넣어주고 200 ok를 받으면 

    아래와 같은 결과를 볼 수 있다! 

     

    2. request body를 사용할 때

     

    # router 부분 
     
    @router.post('/define', response_model=Dict[str, food.Define_Item])
    def define_item(request:food.Define_Item):
        data = ctrl_food.define_item(**request.dict())
       
        return {'data': data}

    # model 부분 -> food.py

     
    from typing import List, Set, Union
    from pydantic import BaseModel


    class Define_Item(BaseModel):
        req_id : Union[str, None] = None
        pw : Union[str, None] = None

    # controller 부분 => food.py

     
    from typing import List
    from loguru import logger
    from common.utils import *

    import random

    def define_item(req_id:str, pw:str):
        dicted_item = {'req_id' : req_id,
                       'pw': pw}
       
        data = dicted_item

        return data
     


    위와 같이 만든 후, - > docs 에서 body에 들어갈 임의의 값 넣어주고, 형이 맞으면 

     

     

    지금 처럼 200 이면서 형태와 알맞은 상태의 결과값을 반환함 ! 

     

     

    이렇게 test용 router를 구현하면서 각각 controller, model을 사용해보았다.

    그 외 조금 다양한 전처리 방식과 빅쿼리 연결 방법도 포스팅 예정! 

Designed by Tistory.