fastapi: 在正式站直接关闭docs文档
一,代码
.env
# 当前环境,开发,development, 测试,testing,正式: production
ENV="production"
main.py
ENV = settings.ENV
print("ENV:", ENV)
IS_DEV = ENV == "development" or ENV == "testing"
print("IS_DEV:", IS_DEV)
# 创建FastAPI应用,并传入 lifespan
api_app = FastAPI(title="我的API项目",
docs_url=None,
redoc_url=None,
openapi_url=None)
if IS_DEV:
security = HTTPBasic()
# 2. 账号密码校验函数
def datetime_verify_docs(credentials: HTTPBasicCredentials = Depends(security)):
# 使用 secrets.compare_digest 防范计时攻击 (Timing Attacks)
correct_username = secrets.compare_digest(credentials.username, "admin")
correct_password = secrets.compare_digest(credentials.password, "123456")
if not (correct_username and correct_password):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="用户名或密码错误",
headers={"WWW-Authenticate": "Basic"},
)
return credentials.username
# 3. 手动重写 /openapi.json 并加锁
@api_app.get("/openapi.json", include_in_schema=False)
async def get_open_api_endpoint(username: str = Depends(datetime_verify_docs)):
if IS_DEV:
return get_openapi(title=api_app.title, version=api_app.version, routes=api_app.routes)
else:
return None
# 4. 手动重写 /docs 并加锁
@api_app.get("/docs", include_in_schema=False)
async def get_documentation(username: str = Depends(datetime_verify_docs)):
return get_swagger_ui_html(openapi_url="/api/openapi.json",
title=api_app.title + " - Docs",
# 【核心修正 3】:静态资源路径也必须拼接 root_path,否则会去根目录下找,导致404或找错
swagger_js_url=f"/static/swagger/swagger-ui-bundle.js",
swagger_css_url=f"/static/swagger/swagger-ui.css",
swagger_favicon_url=f"/static/swagger/favicon.png"
)
说明:setting是从.env中读取的变量,
只有当ENV变量值是development或testing时,才会放开openapi.json和docs
二,测试效果:
如果不是开发或测试环境,则docs会关闭

浙公网安备 33010602011771号