from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from tortoise import Tortoise from app.core.exceptions import SettingNotFound from app.core.init_app import ( init_data, make_middlewares, register_exceptions, register_routers, ) try: from app.settings.config import settings except ImportError: raise SettingNotFound("Can not import settings") @asynccontextmanager async def lifespan(app: FastAPI): await init_data() yield await Tortoise.close_connections() def create_app() -> FastAPI: openapi_tags = [ {"name": "app-用户认证与账户", "description": "用户端账户与认证相关接口(公开/需认证以端点说明为准)"}, {"name": "app-估值评估", "description": "用户端估值评估相关接口(需用户端认证)"}, {"name": "app-短信服务", "description": "用户端短信验证码与登录相关接口(公开)"}, {"name": "app-上传", "description": "用户端文件上传接口(公开)"}, {"name": "admin-基础", "description": "后台登录与个人信息接口(部分公开,其他需认证)"}, {"name": "admin-用户管理", "description": "后台用户管理接口(需认证与权限)"}, {"name": "admin-角色管理", "description": "后台角色管理接口(需认证与权限)"}, {"name": "admin-菜单管理", "description": "后台菜单管理接口(需认证与权限)"}, {"name": "admin-API权限管理", "description": "后台 API 权限管理接口(需认证与权限)"}, {"name": "admin-部门管理", "description": "后台部门管理接口(需认证与权限)"}, {"name": "admin-审计日志", "description": "后台审计日志查询接口(需认证与权限)"}, {"name": "admin-估值评估", "description": "后台估值评估接口(需认证与权限)"}, {"name": "admin-发票管理", "description": "后台发票与抬头管理接口(需认证与权限)"}, {"name": "admin-交易管理", "description": "后台交易/对公转账记录接口(需认证与权限)"}, {"name": "admin-内置接口", "description": "后台第三方内置接口调用(需认证与权限)"}, {"name": "admin-行业管理", "description": "后台行业数据管理(当前公开)"}, {"name": "admin-指数管理", "description": "后台指数数据管理(当前公开)"}, {"name": "admin-政策管理", "description": "后台政策数据管理(当前公开)"}, {"name": "admin-ESG管理", "description": "后台 ESG 数据管理(当前公开)"}, ] app = FastAPI( title=settings.APP_TITLE, description=settings.APP_DESCRIPTION, version=settings.VERSION, openapi_url="/openapi.json", openapi_tags=openapi_tags, middleware=make_middlewares(), lifespan=lifespan, redirect_slashes=False, # 禁用尾部斜杠重定向 ) # 注册静态文件目录 # app.mount("/static", StaticFiles(directory="app/static"), name="static") register_exceptions(app) register_routers(app, prefix="/api") return app app = create_app()