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会关闭

image

posted @ 2026-07-23 12:16  刘宏缔的架构森林  阅读(2)  评论(0)    收藏  举报