如何通过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
相关产品推荐
相关产品推荐

