117 lines
3.5 KiB
Python
117 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
@File: main.py
|
|
@Date: 2020-09-14
|
|
@author: A2TEC
|
|
@section MODIFYINFO 수정정보
|
|
- 수정자/수정일 : 수정내역
|
|
- 2022-01-14/hsj100@a2tec.co.kr : refactoring
|
|
@brief: Main
|
|
"""
|
|
|
|
from dataclasses import asdict
|
|
|
|
import uvicorn
|
|
from fastapi import FastAPI, Depends
|
|
from fastapi.security import APIKeyHeader
|
|
from fastapi.staticfiles import StaticFiles
|
|
from fastapi.exceptions import RequestValidationError
|
|
from fastapi.responses import JSONResponse
|
|
from starlette.middleware.base import BaseHTTPMiddleware
|
|
from starlette.middleware.cors import CORSMiddleware
|
|
|
|
from rest.app.common import consts
|
|
|
|
from rest.app.database.conn import db
|
|
from rest.app.common.config import conf
|
|
from rest.app.middlewares.token_validator import access_control
|
|
from rest.app.middlewares.trusted_hosts import TrustedHostMiddleware
|
|
from rest.app.routes import dev, index, auth, users, services
|
|
from contextlib import asynccontextmanager
|
|
|
|
from custom_logger.custom_log import custom_logger as LOG
|
|
|
|
|
|
API_KEY_HEADER = APIKeyHeader(name='Authorization', auto_error=False)
|
|
|
|
|
|
@asynccontextmanager
|
|
async def lifespan(app: FastAPI):
|
|
# When service starts.
|
|
LOG.info("REST start")
|
|
|
|
yield
|
|
|
|
# When service is stopped.
|
|
LOG.info("REST shutdown")
|
|
|
|
|
|
def create_app():
|
|
"""
|
|
fast_api_app 생성
|
|
|
|
:return: fast_api_app
|
|
"""
|
|
configurations = conf()
|
|
fast_api_app = FastAPI(
|
|
title=configurations.SW_TITLE,
|
|
version=configurations.SW_VERSION,
|
|
description=configurations.SW_DESCRIPTION,
|
|
terms_of_service=configurations.TERMS_OF_SERVICE,
|
|
contact=configurations.CONTEACT,
|
|
license_info={'name': 'Copyright by A2TEC', 'url': 'http://www.a2tec.co.kr'},
|
|
lifespan=lifespan
|
|
)
|
|
|
|
# 데이터 베이스 이니셜라이즈
|
|
conf_dict = asdict(configurations)
|
|
db.init_app(fast_api_app, **conf_dict)
|
|
|
|
# 레디스 이니셜라이즈
|
|
|
|
# 미들웨어 정의
|
|
fast_api_app.add_middleware(middleware_class=BaseHTTPMiddleware, dispatch=access_control)
|
|
fast_api_app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=conf().ALLOW_SITE,
|
|
allow_credentials=True,
|
|
allow_methods=['*'],
|
|
allow_headers=['*'],
|
|
)
|
|
fast_api_app.add_middleware(TrustedHostMiddleware, allowed_hosts=conf().TRUSTED_HOSTS, except_path=['/health'])
|
|
|
|
# 라우터 정의
|
|
fast_api_app.include_router(index.router, tags=['Defaults'])
|
|
|
|
# if conf().DEBUG:
|
|
# fast_api_app.include_router(auth.router, tags=['Authentication'], prefix='/api')
|
|
|
|
fast_api_app.include_router(services.router, tags=['Services'], prefix='/api', dependencies=[Depends(API_KEY_HEADER)])
|
|
|
|
# if conf().DEBUG:
|
|
# fast_api_app.include_router(users.router, tags=['Users'], prefix='/api', dependencies=[Depends(API_KEY_HEADER)])
|
|
# fast_api_app.include_router(dev.router, tags=['Developments'], prefix='/api', dependencies=[Depends(API_KEY_HEADER)])
|
|
|
|
import os
|
|
# fast_api_app.mount('/static', StaticFiles(directory=os.path.abspath('./rest/app/static')), name="static")
|
|
|
|
return fast_api_app
|
|
|
|
|
|
app = create_app()
|
|
|
|
#TODO(jwkim): 422 error handler
|
|
# @app.exception_handler(RequestValidationError)
|
|
# async def validation_exception_handler(request, exc):
|
|
# err = exc.errors()
|
|
# return JSONResponse(
|
|
# status_code=422,
|
|
# content={
|
|
# "result": False,
|
|
# "error": f"VALIDATION ERROR : {err}",
|
|
# "data": None},
|
|
# )
|
|
|
|
if __name__ == '__main__':
|
|
uvicorn.run('main:app', host='0.0.0.0', port=conf().REST_SERVER_PORT, reload=True)
|