Files
RuoYi-Vue3-FastAPI/ruoyi-fastapi-backend/server.py
T

149 lines
6.0 KiB
Python

from collections.abc import AsyncGenerator
from contextlib import asynccontextmanager
from fastapi import FastAPI, applications
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
from fastapi.responses import HTMLResponse
from config.env import AppConfig
from config.get_db import init_create_table
from config.get_redis import RedisUtil
from config.get_scheduler import SchedulerUtil
from exceptions.handle import handle_exception
from middlewares.handle import handle_middleware
from module_admin.controller.cache_controller import cache_controller
from module_admin.controller.captcha_controller import captcha_controller
from module_admin.controller.common_controller import common_controller
from module_admin.controller.config_controller import config_controller
from module_admin.controller.dept_controller import dept_controller
from module_admin.controller.dict_controller import dict_controller
from module_admin.controller.job_controller import job_controller
from module_admin.controller.log_controller import log_controller
from module_admin.controller.login_controller import login_controller
from module_admin.controller.menu_controller import menu_controller
from module_admin.controller.notice_controller import notice_controller
from module_admin.controller.online_controller import online_controller
from module_admin.controller.post_controller import post_controller
from module_admin.controller.role_controller import role_controller
from module_admin.controller.server_controller import server_controller
from module_admin.controller.user_controller import user_controller
from module_generator.controller.gen_controller import gen_controller
from sub_applications.handle import handle_sub_applications
from utils.common_util import worship
from utils.log_util import logger
# 生命周期事件
@asynccontextmanager
async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
logger.info(f'⏰️ {AppConfig.app_name}开始启动')
worship()
await init_create_table()
app.state.redis = await RedisUtil.create_redis_pool()
await RedisUtil.init_sys_dict(app.state.redis)
await RedisUtil.init_sys_config(app.state.redis)
await SchedulerUtil.init_system_scheduler()
logger.info(f'🚀 {AppConfig.app_name}启动成功')
yield
await RedisUtil.close_redis_pool(app)
await SchedulerUtil.close_system_scheduler()
def setup_docs_static_resources(
redoc_js_url: str = 'https://registry.npmmirror.com/redoc/2/files/bundles/redoc.standalone.js',
redoc_favicon_url: str = 'https://fastapi.tiangolo.com/img/favicon.png',
swagger_js_url: str = 'https://registry.npmmirror.com/swagger-ui-dist/5/files/swagger-ui-bundle.js',
swagger_css_url: str = 'https://registry.npmmirror.com/swagger-ui-dist/5/files/swagger-ui.css',
swagger_favicon_url: str = 'https://fastapi.tiangolo.com/img/favicon.png',
) -> None:
"""
配置文档静态资源
:param redoc_js_url: 用于加载ReDoc JavaScript的URL
:param redoc_favicon_url: ReDoc要使用的favicon的URL
:param swagger_js_url: 用于加载Swagger UI JavaScript的URL
:param swagger_css_url: 用于加载Swagger UI CSS的URL
:param swagger_favicon_url: Swagger UI要使用的favicon的URL
:return:
"""
def redoc_monkey_patch(*args, **kwargs) -> HTMLResponse:
return get_redoc_html(
*args,
**kwargs,
redoc_js_url=redoc_js_url,
redoc_favicon_url=redoc_favicon_url,
)
def swagger_ui_monkey_patch(*args, **kwargs) -> HTMLResponse:
return get_swagger_ui_html(
*args,
**kwargs,
swagger_js_url=swagger_js_url,
swagger_css_url=swagger_css_url,
swagger_favicon_url=swagger_favicon_url,
)
applications.get_redoc_html = redoc_monkey_patch
applications.get_swagger_ui_html = swagger_ui_monkey_patch
def register_routers(app: FastAPI) -> None:
"""
注册路由
:param app: FastAPI对象
:return:
"""
# 加载路由列表
controller_list = [
{'router': login_controller, 'tags': ['登录模块']},
{'router': captcha_controller, 'tags': ['验证码模块']},
{'router': user_controller, 'tags': ['系统管理-用户管理']},
{'router': role_controller, 'tags': ['系统管理-角色管理']},
{'router': menu_controller, 'tags': ['系统管理-菜单管理']},
{'router': dept_controller, 'tags': ['系统管理-部门管理']},
{'router': post_controller, 'tags': ['系统管理-岗位管理']},
{'router': dict_controller, 'tags': ['系统管理-字典管理']},
{'router': config_controller, 'tags': ['系统管理-参数管理']},
{'router': notice_controller, 'tags': ['系统管理-通知公告管理']},
{'router': log_controller, 'tags': ['系统管理-日志管理']},
{'router': online_controller, 'tags': ['系统监控-在线用户']},
{'router': job_controller, 'tags': ['系统监控-定时任务']},
{'router': server_controller, 'tags': ['系统监控-服务监控']},
{'router': cache_controller, 'tags': ['系统监控-缓存监控']},
{'router': common_controller, 'tags': ['通用模块']},
{'router': gen_controller, 'tags': ['代码生成']},
]
for controller in controller_list:
app.include_router(router=controller.get('router'), tags=controller.get('tags'))
def create_app() -> FastAPI:
"""
创建FastAPI应用
:return: FastAPI对象
"""
# 配置文档静态资源
setup_docs_static_resources()
# 初始化FastAPI对象
app = FastAPI(
title=AppConfig.app_name,
description=f'{AppConfig.app_name}接口文档',
version=AppConfig.app_version,
lifespan=lifespan,
)
# 挂载子应用
handle_sub_applications(app)
# 加载中间件处理方法
handle_middleware(app)
# 加载全局异常处理方法
handle_exception(app)
# 注册路由
register_routers(app)
return app