[Python] FASTAPI

김진회·2023년 8월 30일
0

python

목록 보기
1/1

*빠른 기록을 위한 요약 정리

최근 파이썬으로 백엔드 서버를 구축했고, 선택한 웹 프레임워크이다.

1. 디렉토리 구조(개인마다 다름)

-common
-controller
-dao
└ database_setting
└ dbconfig.py
└ secret.json (db계정정보)
-model
-service
-main

1) common

암복호화 함수, exception관련, logger, statuscode, util 등

2) controller

일반 controller와 동일. 아래는 예시

importer_uri = "/api"
router = APIRouter(
    prefix=importer_uri
)

item_service = ItemService()

@router.post("/item")
async def post_item(request: CreateItemRequest):
    result = await item_service.create_item(request.id, request.pwd)
    return ResponseBuilder().status(StatusCode.OK_200).payload(result).message("성공").build()

3) dao

db관련 로직들. setting도 여기다했지만 나중 config가 많아지면 config 따로 빼는 것이 좋을 듯

# dbconfig.py
secret_json = json.loads(open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "secret.json")).read())
database_auth = secret_json['db']
DB_CONNECTION_URL = f"mysql+pymysql://{database_auth.get('username')}:{database_auth.get('password')}@{database_auth.get('host')}:{database_auth.get('port')}/{database_auth.get('database')}?charset=utf8"

db_engine = create_engine(DB_CONNECTION_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=db_engine)
Base = declarative_base()
# item_dao.py
# session 맺는 부분 각 로직마다 안해도 됨
class ItemDao:
    async def save_item(self, item_entity: Item):
        session = SessionLocal()
        session.add(item_entity)
        session.commit()
        item_id = item_entity.id
        session.close()
        return item_id

4) model

dto와 같음

# item.py
class Item:
    def __init__(self, id: int, name: str):
        self.id
        self.name
        self.default_type: Final = "Testcase"
# item.py
class Item(Base): # Entity
    __tablename__ = "item"
    id = Column(BIGINT, primary_key=True, autoincrement=True)
    name = Column(VARCHAR(30))
    default_type = Column(VARCHAR(200))

5) service

로직을 담당하는 service

# item_service.py
class ItemService:
  async def create_item(self, id: int, pwd: int):
    ~로직~
    return result

6) main

main_router = FastAPI()
main_router.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)

main_router.add_exception_handler(CustomException, custom_exception_handle)
main_router.include_router(item_router)

if __name__ == '__main__':
    uvicorn_configuration = uvicorn.Config(main_router, host="0.0.0.0", port=8000)
    uvicorn_server = uvicorn.Server(uvicorn_configuration)
    uvicorn_server.run()
profile
SSAFY 7기. HMG. 협업, 소통, 사용자중심

0개의 댓글