11from collections .abc import AsyncGenerator
22from contextlib import asynccontextmanager
33
4- from fastapi import FastAPI , applications
5- from fastapi .openapi .docs import get_redoc_html , get_swagger_ui_html
6- from fastapi .responses import HTMLResponse
4+ from fastapi import FastAPI
75
86from common .router import auto_register_routers
97from config .env import AppConfig
1513from sub_applications .handle import handle_sub_applications
1614from utils .common_util import worship
1715from utils .log_util import logger
16+ from utils .server_util import APIDocsUtil , IPUtil
1817
1918
2019# 生命周期事件
@@ -28,48 +27,35 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, None]:
2827 await RedisUtil .init_sys_config (app .state .redis )
2928 await SchedulerUtil .init_system_scheduler ()
3029 logger .info (f'🚀 { AppConfig .app_name } 启动成功' )
31- yield
32- await RedisUtil .close_redis_pool (app )
33- await SchedulerUtil .close_system_scheduler ()
34-
35-
36- def setup_docs_static_resources (
37- redoc_js_url : str = 'https://registry.npmmirror.com/redoc/2/files/bundles/redoc.standalone.js' ,
38- redoc_favicon_url : str = 'https://fastapi.tiangolo.com/img/favicon.png' ,
39- swagger_js_url : str = 'https://registry.npmmirror.com/swagger-ui-dist/5/files/swagger-ui-bundle.js' ,
40- swagger_css_url : str = 'https://registry.npmmirror.com/swagger-ui-dist/5/files/swagger-ui.css' ,
41- swagger_favicon_url : str = 'https://fastapi.tiangolo.com/img/favicon.png' ,
42- ) -> None :
43- """
44- 配置文档静态资源
30+ host = AppConfig .app_host
31+ port = AppConfig .app_port
32+ if host == '0.0.0.0' :
33+ local_ip = IPUtil .get_local_ip ()
34+ network_ips = IPUtil .get_network_ips ()
35+ else :
36+ local_ip = host
37+ network_ips = [host ]
4538
46- :param redoc_js_url: 用于加载ReDoc JavaScript的URL
47- :param redoc_favicon_url: ReDoc要使用的favicon的URL
48- :param swagger_js_url: 用于加载Swagger UI JavaScript的URL
49- :param swagger_css_url: 用于加载Swagger UI CSS的URL
50- :param swagger_favicon_url: Swagger UI要使用的favicon的URL
51- :return:
52- """
39+ app_links = [f'🏠 Local: <cyan>http://{ local_ip } :{ port } </cyan>' ]
40+ app_links .extend (f'📡 Network: <cyan>http://{ ip } :{ port } </cyan>' for ip in network_ips )
41+ logger .opt (colors = True ).info ('💻 应用地址:\n ' + '\n ' .join (app_links ))
5342
54- def redoc_monkey_patch (* args , ** kwargs ) -> HTMLResponse :
55- return get_redoc_html (
56- * args ,
57- ** kwargs ,
58- redoc_js_url = redoc_js_url ,
59- redoc_favicon_url = redoc_favicon_url ,
43+ if not AppConfig .app_disable_swagger :
44+ swagger_links = [f'🏠 Local: <cyan>http://{ local_ip } :{ port } { APIDocsUtil .docs_url ()} </cyan>' ]
45+ swagger_links .extend (
46+ f'📡 Network: <cyan>http://{ ip } :{ port } { APIDocsUtil .docs_url ()} </cyan>' for ip in network_ips
6047 )
48+ logger .opt (colors = True ).info ('📄 Swagger文档:\n ' + '\n ' .join (swagger_links ))
6149
62- def swagger_ui_monkey_patch (* args , ** kwargs ) -> HTMLResponse :
63- return get_swagger_ui_html (
64- * args ,
65- ** kwargs ,
66- swagger_js_url = swagger_js_url ,
67- swagger_css_url = swagger_css_url ,
68- swagger_favicon_url = swagger_favicon_url ,
50+ if not AppConfig .app_disable_redoc :
51+ redoc_links = [f'🏠 Local: <cyan>http://{ local_ip } :{ port } { APIDocsUtil .redoc_url ()} </cyan>' ]
52+ redoc_links .extend (
53+ f'📡 Network: <cyan>http://{ ip } :{ port } { APIDocsUtil .redoc_url ()} </cyan>' for ip in network_ips
6954 )
70-
71- applications .get_redoc_html = redoc_monkey_patch
72- applications .get_swagger_ui_html = swagger_ui_monkey_patch
55+ logger .opt (colors = True ).info ('📚 ReDoc文档:\n ' + '\n ' .join (redoc_links ))
56+ yield
57+ await RedisUtil .close_redis_pool (app )
58+ await SchedulerUtil .close_system_scheduler ()
7359
7460
7561def create_app () -> FastAPI :
@@ -78,16 +64,23 @@ def create_app() -> FastAPI:
7864
7965 :return: FastAPI对象
8066 """
81- # 配置文档静态资源
82- setup_docs_static_resources ()
67+ # 配置API文档静态资源
68+ APIDocsUtil . setup_docs_static_resources ()
8369 # 初始化FastAPI对象
8470 app = FastAPI (
8571 title = AppConfig .app_name ,
8672 description = f'{ AppConfig .app_name } 接口文档' ,
8773 version = AppConfig .app_version ,
8874 lifespan = lifespan ,
75+ openapi_url = APIDocsUtil .proxy_openapi_url (),
76+ docs_url = APIDocsUtil .proxy_docs_url (),
77+ redoc_url = APIDocsUtil .proxy_redoc_url (),
78+ swagger_ui_oauth2_redirect_url = APIDocsUtil .proxy_oauth2_redirect_url (),
8979 )
9080
81+ # 自定义API文档路由,修复无法直接通过后端地址访问文档的问题
82+ APIDocsUtil .custom_api_docs_router (app )
83+
9184 # 挂载子应用
9285 handle_sub_applications (app )
9386 # 加载中间件处理方法
0 commit comments