본문 바로가기

FastAPI

main.py 수정 및 Swagger 커스터마이징

I. main.py의 내용 분리

main.py를 simple하게 만들기 위하여 inits.py와 root.py, swagger.py로 나누었다.

     1. inits.py: 어플리케이션을 초기화하는 과정을 담는다. (라우터 및 lifespan 등록)

     2. root.py: 임시로 Hello World 첫화면을 만들어보기 위한 파일

     3. swagger .py: swagger docs와 swagger redoc의 경로와 내용을 수정하기 위한 파일

#  Svelte_0.0.2/main.py

from app.core.inits import initialize_app

app = initialize_app()
# Svelte_0.0.2/app/core/inits.py

import os

import redis
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from app.core.database import ASYNC_ENGINE
from app.core.redis import redis_client
from app.core.settings import CONFIG
from app.views import root, swagger


def including_router(app):
    app.include_router(swagger.router, prefix="/swagger")
    app.include_router(root.router, prefix="", tags=["Root"]) # root 페이지는 / 슬래시를 없애라.


def initialize_app():
    print("3. Initializing app.....APP_ENV, CONFIG.ORIGINS: ", CONFIG.APP_ENV, CONFIG.ORIGINS)
    app = FastAPI(title=CONFIG.APP_NAME,
                  version=CONFIG.APP_VERSION,
                  description=CONFIG.APP_DESCRIPTION,
                  # lifespan=lifespan,
                  # docs_url=None, redoc_url=None 을 주면 기본 /docs, /redoc 페이지가 비활성화됩니다.
                  docs_url=None , redoc_url=None) # docs_url을 지정하는 커스텀 마이징할 때 (CSRF_TOKEN적용시)
                  # docs_url = None, redoc_url = "/swagger/redoc")
    '''# 주소만 커스터마이징할 때 redoc_url = "/swagger/redoc" 이렇게 하면된다. 
        주소 뿐만 아니라 html 문서자체를 커스텀 마이징하는 경우는 views/swagger.py 의 함수를 사용하면 된다.
    '''

    including_router(app)
    return app

 

II. root.py와 swagger.py생성

# Svelte_0.0.2/app/views/root.py

from fastapi import APIRouter, Request, Depends

router = APIRouter()

@router.get("/")
def get_root():
    """svelte 프론트엔드 단에서는 Home.svelte ("/") 으로 가게 변경함"""
    return {"message": "Hello World"}
# Svelte_0.0.2/app/views/swagger.py

from fastapi import APIRouter, Request, Depends
from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html

router = APIRouter()

open_api_url = "/openapi.json"

@router.get("/docs", include_in_schema=False)
async def custom_docs_html():
    """여기에 html 문서자체를 커스텀 마이징하는 로직을 추가하면 된다.
    CSRF_TOKEN을 주입하는 경우 등..."""
    return get_swagger_ui_html(
        openapi_url=open_api_url,  # openapi 스펙 파일 URL
        title="Custom API Docs",
    )


@router.get("/redoc", include_in_schema=False)
async def custom_redoc_html():
    """여기에 html 문서자체를 커스텀 마이징하는 로직을 추가하면 된다."""
    return get_redoc_html(
        openapi_url=open_api_url,   # 스펙 파일 경로
        title="Custom ReDoc",          # 페이지 제목
        redoc_favicon_url="https://fastapi.tiangolo.com/img/favicon.png",
    )