You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python+Starlette/FastAPI判断请求是否来自Swagger UI

判断请求是否来自Swagger UI的可行方法

在FastAPI/Starlette中,你可以通过以下几种方式判断请求是否来自Swagger UI:

1. 检查Referer请求头

Swagger UI发起请求时,Referer头会指向Swagger的页面地址(默认是/docs或/redoc),以此作为判断依据:

from fastapi import Request, FastAPI

app = FastAPI()

@app.get("/")
async def root(request: Request):
    referer = request.headers.get("referer", "")
    # 匹配默认的Swagger页面路径,若自定义过路由需修改对应字符串
    is_swagger_request = "/docs" in referer or "/redoc" in referer
    
    return {"message": "Hello Swagger UI"} if is_swagger_request else {"message": "Hello World"}

注意:部分浏览器或代理可能会禁用Referer头,但Swagger UI默认会发送该头;若你自定义了Swagger的访问路径,需同步调整判断的字符串。

2. 添加自定义请求头(最可靠)

通过修改Swagger UI的配置,让其发起的所有请求携带自定义标识头,后端只需检查该头即可:

步骤1:配置Swagger UI添加自定义头

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():
    return get_swagger_ui_html(
        openapi_url=app.openapi_url,
        title=f"{app.title} - Swagger UI",
        swagger_ui_parameters={
            "requestInterceptor": """(req) => {
                req.headers['X-From-Swagger'] = 'true';
                return req;
            }"""
        }
    )

步骤2:后端检查自定义头

@app.get("/")
async def root(request: Request):
    is_swagger_request = request.headers.get("X-From-Swagger") == "true"
    
    return {"message": "Hello Swagger UI"} if is_swagger_request else {"message": "Hello World"}

这种方式可靠性最高,因为自定义头由我们主动控制,除非用户刻意伪造,否则不会被其他客户端携带。

3. 检查User-Agent头(仅供补充)

Swagger UI的请求会使用浏览器的User-Agent,而Postman、自定义前端应用的User-Agent通常有明显区别,但该方法可靠性较低——用户可轻易修改User-Agent,仅适合作为辅助判断:

from fastapi import Request, FastAPI

app = FastAPI()

@app.get("/")
async def root(request: Request):
    user_agent = request.headers.get("user-agent", "")
    # 示例:匹配常见浏览器标识,排除Postman等客户端
    is_swagger_request = "Mozilla/" in user_agent and "Postman" not in user_agent
    
    return {"message": "Hello Swagger UI"} if is_swagger_request else {"message": "Hello World"}

内容的提问来源于stack exchange,提问作者Ghasem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 18:32:22