Skip to content

Commit 26cc9c4

Browse files
authored
fix: 修复无法直接通过后端地址访问API文档的问题 (#20)
1 parent af61981 commit 26cc9c4

File tree

8 files changed

+453
-43
lines changed

8 files changed

+453
-43
lines changed

ruoyi-fastapi-backend/.env.dev

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ APP_RELOAD = true
1717
APP_IP_LOCATION_QUERY = true
1818
# 应用是否允许账号同时登录
1919
APP_SAME_TIME_LOGIN = true
20+
# 应用是否禁用Swagger文档
21+
APP_DISABLE_SWAGGER = false
22+
# 应用是否禁用ReDoc文档
23+
APP_DISABLE_REDOC = false
2024

2125
# -------- Jwt配置 --------
2226
# Jwt秘钥

ruoyi-fastapi-backend/.env.dockermy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ APP_RELOAD = false
1717
APP_IP_LOCATION_QUERY = true
1818
# 应用是否允许账号同时登录
1919
APP_SAME_TIME_LOGIN = true
20+
# 应用是否禁用Swagger文档
21+
APP_DISABLE_SWAGGER = true
22+
# 应用是否禁用ReDoc文档
23+
APP_DISABLE_REDOC = true
2024

2125
# -------- Jwt配置 --------
2226
# Jwt秘钥

ruoyi-fastapi-backend/.env.dockerpg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ APP_RELOAD = false
1717
APP_IP_LOCATION_QUERY = true
1818
# 应用是否允许账号同时登录
1919
APP_SAME_TIME_LOGIN = true
20+
# 应用是否禁用Swagger文档
21+
APP_DISABLE_SWAGGER = true
22+
# 应用是否禁用ReDoc文档
23+
APP_DISABLE_REDOC = true
2024

2125
# -------- Jwt配置 --------
2226
# Jwt秘钥

ruoyi-fastapi-backend/.env.prod

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ APP_RELOAD = false
1717
APP_IP_LOCATION_QUERY = true
1818
# 应用是否允许账号同时登录
1919
APP_SAME_TIME_LOGIN = true
20+
# 应用是否禁用Swagger文档
21+
APP_DISABLE_SWAGGER = true
22+
# 应用是否禁用ReDoc文档
23+
APP_DISABLE_REDOC = true
2024

2125
# -------- Jwt配置 --------
2226
# Jwt秘钥

ruoyi-fastapi-backend/config/env.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class AppSettings(BaseSettings):
2323
app_reload: bool = True
2424
app_ip_location_query: bool = True
2525
app_same_time_login: bool = True
26+
app_disable_swagger: bool = False
27+
app_disable_redoc: bool = False
2628

2729

2830
class JwtSettings(BaseSettings):

ruoyi-fastapi-backend/server.py

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from collections.abc import AsyncGenerator
22
from 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

86
from common.router import auto_register_routers
97
from config.env import AppConfig
@@ -15,6 +13,7 @@
1513
from sub_applications.handle import handle_sub_applications
1614
from utils.common_util import worship
1715
from 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

7561
def 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

Comments
 (0)