*빠른 기록을 위한 요약 정리
최근 파이썬으로 백엔드 서버를 구축했고, 선택한 웹 프레임워크이다.
-common
-controller
-dao
└ database_setting
└ dbconfig.py
└ secret.json (db계정정보)
-model
-service
-main
암복호화 함수, exception관련, logger, statuscode, util 등
일반 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()
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
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))
로직을 담당하는 service
# item_service.py
class ItemService:
async def create_item(self, id: int, pwd: int):
~로직~
return result
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()