http://localhost:16888/docs python GET https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css net::ERR_CONNECTION_TIMED_OUT
时间: 2025-07-29 17:16:36 浏览: 26
<think>我们参考用户提供的引用[1]:在没有外网的状态下,Swagger UI的文档链接无法打开,因为它依赖的JS和CSS来自CDN。用户的问题是在使用Swagger UI时,获取`https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css`时发生连接超时(net::ERR_CONNECTION_TIMED_OUT)。根据引用[1]和引用[2]的启示,我们可以考虑两种解决方案:
1. 使用其他可用的CDN节点(如fastly.jsdelivr.net)来替代cdn.jsdelivr.net,以绕过网络问题。
2. 将所需的资源文件下载到本地,然后修改Swagger UI的配置,使用本地文件提供服务,从而避免依赖外部CDN。
由于用户提到的是Python环境(可能是FastAPI或其他框架集成的Swagger UI),我们可以针对这两种方案提供解决方法。
### 方案1:使用备用CDN节点
我们可以尝试将URL中的`cdn.jsdelivr.net`替换为`fastly.jsdelivr.net`,因为引用[1]中也提到了这个备用节点。但是,请注意,这仍然依赖于外部网络,如果备用节点也无法访问,则可能无效。
### 方案2:下载资源文件到本地(推荐)
这是最可靠的解决方案,尤其对于内网环境。步骤如下:
1. 下载Swagger UI所需的资源文件(如swagger-ui-bundle.js、swagger-ui.css等)到本地。
2. 修改Swagger UI的配置,使其使用本地文件路径。
#### 具体步骤:
**步骤1:下载资源文件**
我们可以从jsDelivr或其他CDN下载所需的文件。由于用户使用的是`swagger-ui-dist@5`,我们可以下载该版本的文件。如果无法访问原始CDN,可以尝试使用其他CDN(如unpkg)或者从GitHub仓库下载。
以下是一个示例,使用Python下载文件并保存到本地:
```python
import os
import requests
# 创建目录保存资源
os.makedirs("swagger_ui", exist_ok=True)
# 需要下载的资源列表
resources = [
("https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js", "swagger-ui-bundle.js"),
("https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css", "swagger-ui.css"),
# 如果还需要其他文件,如favicon,可以添加
("https://fastapi.tiangolo.com/img/favicon.png", "favicon.png"),
]
for url, filename in resources:
try:
# 尝试使用备用节点
if url.startswith("https://cdn.jsdelivr.net"):
url_fastly = url.replace("cdn.jsdelivr.net", "fastly.jsdelivr.net")
response = requests.get(url_fastly, timeout=10)
else:
response = requests.get(url, timeout=10)
response.raise_for_status()
with open(os.path.join("swagger_ui", filename), "wb") as f:
f.write(response.content)
print(f"已下载: {filename}")
except Exception as e:
print(f"下载失败 {filename}: {e}")
```
**步骤2:配置Swagger UI使用本地文件**
对于FastAPI,我们可以通过设置`swagger_js_url`和`swagger_css_url`参数来指定本地文件路径。例如:
```python
from fastapi import FastAPI
from fastapi.openapi.docs import get_swagger_ui_html
app = FastAPI(docs_url=None, redoc_url=None) # 禁用自动生成的docs和redoc
# 自定义Swagger UI
@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():
return get_swagger_ui_html(
openapi_url=app.openapi_url,
title=app.title + " - Swagger UI",
swagger_js_url="/static/swagger-ui-bundle.js", # 本地路径
swagger_css_url="/static/swagger-ui.css", # 本地路径
swagger_favicon_url="/static/favicon.png"
)
# 添加静态文件目录,假设将资源放在项目根目录下的swagger_ui文件夹,并挂载到/static
from starlette.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="swagger_ui"), name="static")
```
这样,当访问`/docs`时,Swagger UI将使用本地静态文件,不再依赖外部CDN。
### 注意事项
1. 确保静态文件目录配置正确,使得浏览器可以访问到这些文件。
2. 如果使用其他框架(如Flask),原理类似,需要将文件放入静态文件夹并修改Swagger UI模板中资源的URL。
3. 如果无法从CDN下载文件,可以手动下载并放入项目目录。
### 相关问题
1. 如何为FastAPI的Swagger UI自定义样式?
2. 如何在内网环境中部署FastAPI应用并保证Swagger UI正常使用?
3. 如何更新本地的Swagger UI资源文件?
4. 除了Swagger UI,还有哪些API文档工具可以离线使用?
5. 如何配置Nginx来提供Swagger UI的静态文件?
以上方法可以彻底解决因CDN连接超时导致的Swagger UI无法加载的问题。</think>针对 Swagger UI 连接 CDN 超时的问题,结合引用信息[^1][^2],以下是完整的解决方案:
### 问题根源分析
1. **外网依赖问题**:Swagger UI 默认从 `cdn.jsdelivr.net` 加载资源,当无外网访问或 CDN 不稳定时会导致超时[^1]
2. **CDN 节点失效**:特定 CDN 节点可能被限制或临时不可用(如 `net::ERR_CONNECTION_TIMED_OUT`)
3. **版本指向问题**:`@5` 这类非固定版本号可能指向已失效资源[^2]
---
### 永久解决方案:本地化资源(推荐)
通过 Python 将资源下载到本地,彻底解决外网依赖问题:
```python
import requests
import os
# 创建资源目录
os.makedirs("swagger_resources", exist_ok=True)
# 需要下载的资源列表
resources = [
("swagger-ui-bundle.js", "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui-bundle.js"),
("swagger-ui.css", "https://cdn.jsdelivr.net/npm/swagger-ui-dist@5/swagger-ui.css"),
("redoc.standalone.js", "https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js"),
("favicon.png", "https://fastapi.tiangolo.com/img/favicon.png")
]
for filename, url in resources:
try:
# 尝试使用 fastly 备用节点
fastly_url = url.replace("cdn.jsdelivr.net", "fastly.jsdelivr.net")
response = requests.get(fastly_url, timeout=10)
if response.status_code == 200:
with open(f"swagger_resources/{filename}", "wb") as f:
f.write(response.content)
print(f"✅ 成功下载: {filename}")
else:
print(f"⚠️ 资源不可用: {url}")
except Exception as e:
print(f"❌ 下载失败 {filename}: {str(e)}")
```
---
### FastAPI 配置修改
修改 FastAPI 应用配置,指向本地资源(参考引用[^1]):
```python
from fastapi import FastAPI
from fastapi.openapi.docs import get_swagger_ui_html
app = FastAPI(docs_url=None, redoc_url=None) # 禁用默认路由
# 自定义Swagger UI路由
@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():
return get_swagger_ui_html(
openapi_url="/openapi.json",
title="API Docs",
swagger_js_url="/static/swagger-ui-bundle.js", # 本地路径
swagger_css_url="/static/swagger-ui.css", # 本地路径
swagger_favicon_url="/static/favicon.png"
)
# 配置静态文件路由
from starlette.staticfiles import StaticFiles
app.mount("/static", StaticFiles(directory="swagger_resources"), name="static")
```
---
### 备选方案:使用可靠 CDN 源
若必须使用 CDN,建议使用带具体版本的 URL(参考引用[^2]):
```python
# 在 FastAPI 初始化时指定
app = FastAPI(swagger_ui_parameters={
"configUrl": "/swagger-config",
"swagger_js_url": "https://cdn.jsdelivr.net/npm/[email protected]/swagger-ui-bundle.js",
"swagger_css_url": "https://cdn.jsdelivr.net/npm/[email protected]/swagger-ui.css"
})
```
> ✅ 推荐版本:`5.9.0`(2023年稳定版),可在 [cdnjs](https://cdnjs.com/libraries/swagger-ui) 查询最新版本
---
### 验证方法
1. 访问 `http://localhost:8000/docs` 应正常加载
2. 浏览器开发者工具检查资源加载状态
3. 使用 `curl` 测试本地资源:
```bash
curl -I http://localhost:8000/static/swagger-ui.css
```
应返回 `HTTP/1.1 200 OK`
---
### 注意事项
1. **内网部署**:本地化方案特别适合 Kubernetes/Docker 等隔离环境
2. **资源更新**:定期检查 [swagger-ui-dist](https://github.com/swagger-api/swagger-ui) 版本更新
3. **安全考虑**:本地资源目录不应暴露敏感文件
通过资源本地化,可彻底解决 `net::ERR_CONNECTION_TIMED_OUT` 问题,并提升文档加载速度[^1][^2]。
---
### 相关问题
1. 如何为 FastAPI 的 Swagger UI 添加自定义身份验证?
2. 在内网环境中如何部署 Swagger UI 文档服务器?
3. 如何更新本地化的 Swagger UI 资源文件版本?
4. 除了 Swagger UI,还有哪些离线可用的 API 文档解决方案?
5. 如何解决 Redoc 文档的 CDN 加载失败问题?
阅读全文
相关推荐



















