FastApI接口文档无法访问

FastAPi上手快且底层嵌套了Swagger会自动生成接口文档,开开心心的写好应用程序部署,结果访问127.0.0.1:8000/docs接口文档的网址访问不了

cdn的地址访问不了,但是有时又能进入,估计是访问Swagger网站的人多了,导致有时候获取资源地址失败,并且如果服务部署在内网无法访问外部的地址的时候也是无法访问127.0.0.1:8000/docs网址的,原因也是swagger的css和js的静态资源无法获取。

下面介绍三种一劳永逸的方式方式不访问Swagger资源地址改为访问本地静态文件

首先在网站能访问的时候下载静态资源到本地保持到一个static的文件中

无法下载的可以在一下链接下载

fastapi==0.95.0版本的swagger静态文件

链接:百度网盘 请输入提取码 提取码:32fc

1、 修改fastapi的源码

将static文件放在项目的根路径中

修改FastApi源码中调用cdn地址的位置,代码位置在fastapi/openapi/docs.py中,将访问cdn的网站代码替换成访问本地静态文件地址

挂载静态文件

app = FastAPI()
# 挂载静态文件
app.mount("/static", StaticFiles(directory="static"), name="static")

官方文档对挂载的解释

静态文件 - FastAPI (tiangolo.com)

在访问将从本地静态文件中读取,能成功访问接口文档

2、 修改默认参数方法

显然上一个方法不及备python的风格,别人运行你的项目时还要求别人修改FastApi的源码不现实,而且如果在线上进行Docker部署还需要修改FastApi源码也挺麻烦的,下面介绍项目不用修改FastApi中源码中的方法来实现。

python中一切皆对象,函数也是一个function对象,函数中的形参和默认参数都有保存在函数对象中,而默认参数的值就保存在__kwdefaults__中,只要在项目启动时候修改fastapi/openapi/docs.py 中函数get_swagger_ui_html的默认值就能实现不用修改源码了。

和一种方式一样将static文件放在项目根路径中

修改项目的代码

app = FastAPI()
# 1.挂载static文件夹
app.mount("/static", StaticFiles(directory="static"), name="static")
​
# 2.修改get_swagger_ui_html函数的默认参数
sys.modules["fastapi.openapi.docs"].\
    get_swagger_ui_html.__kwdefaults__["swagger_js_url"] = "/static/swagger-ui-bundle.js"
sys.modules["fastapi.openapi.docs"].\
    get_swagger_ui_html.__kwdefaults__["swagger_css_url"] = "/static/swagger-ui.css"

上面的修改之后同样也能够访问到接口文档

3、重写docs接口

第二钟方式虽然也能做到不修改FastApi源代码的情况下访问接口文档,但是也不是很优雅,动态修改函数的默认值也不是python推荐的方式。能不能做到通过重写/docs接口而修改swagger静态文件的地址呢。

答案时可以的

同样先将static文件放在项目的根路径下

项目代码中重写docs接口

# 1.不用系统定义的
app = FastAPI(docs_url=None)
# 2.挂载目录
app.mount("/static", StaticFiles(directory="static"), name="static")
​
# 3.重写docs接口
@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",
        oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
        swagger_js_url="/static/swagger-ui-bundle.js",
        swagger_css_url="/static/swagger-ui.css",
    )
也能正常访问本地static下的文件

总结

推荐使用第三种方式

完整的测试代码

# 05.py

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
import uvicorn
from fastapi.openapi.docs import (
    get_swagger_ui_html,
)
​
​
app = FastAPI(docs_url=None)
app.mount("/static", StaticFiles(directory="static"), name="static")
​
​
@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",
        oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,
        swagger_js_url="/static/swagger-ui-bundle.js",
        swagger_css_url="/static/swagger-ui.css",
    )
​
​
@app.get("/home", tags=["这是home测试接口"],
         summary="这是一个测试接口的总结,测试home接口",
         description="这是测试接口的详情描述",
         response_description="这是响应的详情描述",
         deprecated=False)
def home():
    return {"user_id": 1001}
​
​
if __name__ == '__main__':
    uvicorn.run("05:app", reload=True)
  
### 正确配置和访问 FastAPI 自动生成的 API 文档界面 #### 配置 FastAPI 项目以启用自动文档生成功能 为了确保能够顺利访问由 FastAPI 提供的 Swagger UI 和 ReDoc 自动化生成的 API 文档,需要确认 FastAPI 实例已经正确初始化并启用了这些特性。默认情况下,创建一个新的 FastAPI 应用程序实例时会自动开启此功能。 ```python from fastapi import FastAPI app = FastAPI() ``` 这段代码片段展示了最基础的应用启动方式[^1]。当 `FastAPI()` 被调用来构建应用对象时,默认参数设置允许应用程序自动生成两个版本的交互式 API 文档——Swagger UI 和 ReDoc。 #### 访问 Swagger UI 和 ReDoc 的 URL 地址 一旦 FastAPI 应用运行起来,默认会在根路径 `/` 下暴露两个特殊的端点用于展示不同的 API 文档样式: - **Swagger UI**: 可通过浏览器访问 `{your-app-url}/docs` 来查看基于 Swagger UI 构建的交互式 API 文档页面。 - **ReDoc**: 如果更偏好简洁风格,则可以通过访问 `{your-app-url}/redoc` 查看另一个形式的 API 文档视图。 如果遇到无法加载静态资源的情况,比如页面显示为空白,可能是因为服务器未能正确处理来自前端框架所需的 CSS/JS 文件请求。此时应检查网络连接状态以及防火墙或代理设置是否阻止了必要的外部资源下载[^3]。 对于本地开发环境而言,通常只需保证 Python 开发环境中安装有最新版 uvicorn 或其他兼容 ASGI 协议的服务容器来托管 FastAPI 应用即可正常使用上述功能;而对于生产部署场景下则需进一步考虑安全性和性能优化方面的要求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平时不搬砖

创造不易,请动动你发财的小手

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值