FastAPI访问/docs接口文档显示空白、js/css无法加载
FastAPI的接口文档页面空白,可考虑使用插件fastapi-cdn-host来解决,只需增加一行代码即可:fastapi_cdn_host.monkey_patch(app)
·
如图:
原因是FastAPI的接口文档默认使用https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui.css
和https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.9.0/swagger-ui-bundle.js
来渲染页面,而这两个URL是外网的CDN,在国内响应超慢,导致请求超时了。
解决方案是更换CDN或把这两个URL对应的文件下载到本地的static目录中并挂载它,具体代码如下:
from fastapi import FastAPI
# pip install fastapi_cdn_host
from fastapi_cdn_host import patch_docs
app = FastAPI()
# 启动app时会自动将CDN更换为响应速度较快的那个
patch_docs(app)
注:如果是要支持离线文档,可以直接用这个:fastapi-offline · PyPI
## 2024.05.12 补充:一个详细一点的示例
- main.py
#!/usr/bin/env python
import os
import sys
from contextlib import asynccontextmanager
from datetime import datetime
import fastapi_cdn_host
from fastapi import FastAPI, Request
from fastapi.responses import RedirectResponse
__version__ = "1.0.0"
@asynccontextmanager
async def lifespan(app: FastAPI):
# 注册数据库、挂载Redis等……
yield
app = FastAPI(title="FastAPI CDN Host Demo", lifespan=lifespan, version=__version__)
fastapi_cdn_host.patch_docs(app)
@app.get("/", include_in_schema=False)
async def root(request: Request) -> RedirectResponse:
"""首页直接跳转到文档"""
return RedirectResponse("/docs")
@app.get("/robots.txt", include_in_schema=False)
async def robots_txt():
"""声明不允许爬虫访问"""
return """
User-agent: *
Disallow: /
"""
@app.get("/app")
async def app_info(request: Request) -> dict[str, str | dict | datetime | None]:
"""展示客户端IP、服务器时间等信息"""
headers = dict(request.headers)
ip = getattr(request.client, "host", "")
url = request.url
return {
"your ip": ip,
"version": __version__,
"now": datetime.now(),
"headers": headers,
"path": request.url.path,
"url": {"scheme": url.scheme, "hostname": url.hostname, "port": url.port},
}
def _runserver() -> int:
"""This is for debug mode to start server. For prod, use supervisor+gunicorn instead."""
return os.system("fastapi dev")
if __name__ == "__main__": # pragma: no cover
sys.exit(_runserver())
更多推荐
已为社区贡献1条内容
所有评论(0)