FastAPI 集成 RAG 接口如何设置 CORS 跨域配置?

文章导读
在 FastAPI 中集成 RAG 接口时,设置 CORS 跨域配置最直接的方式是使用 fastapi.middleware.cors 中的 CORSMiddleware 中间件,适用于前端页面与 API 接口域名不一致的场景,风险边界在于允许凭据时不能将源设置为通配符。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 FastAPI 中集成 RAG 接口时,设置 CORS 跨域配置最直接的方式是使用 fastapi.middleware.cors 中的 CORSMiddleware 中间件,适用于前端页面与 API 接口域名不一致的场景,风险边界在于允许凭据时不能将源设置为通配符。

先说结论:FastAPI 通过添加 CORSMiddleware 中间件处理跨域,配置时需明确指定允许的来源域名,避免安全漏洞。

  • 适合:前端与后端部署在不同域名或端口,浏览器发起 AJAX/Fetch 请求的场景
  • 先准备:确认前端请求携带的 Header 和 Method,以便在白名单中放行
  • 验收:通过浏览器开发者工具 Network 面板检查响应头是否包含 Access-Control-Allow-Origin

命令速用版

直接在 main.py 中导入中间件并添加到 app,以下代码片段可直接复用:

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:3000"],  # 前端地址
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

为什么会这样

浏览器出于安全策略默认禁止跨域请求,FastAPI 需要显式声明允许哪些外部源访问接口。

FastAPI 集成 RAG 接口如何设置 CORS 跨域配置?

RAG 接口通常被 Web 前端调用,当前端域名(如 example.com)与 API 域名(如 api.example.com)不同时,浏览器会触发同源策略限制。FastAPI 基于 Starlette 构建,内置了 CORS 中间件来处理预检请求(OPTIONS)和添加必要的响应头,无需手动编写每个接口的跨域逻辑。

分步处理

按顺序执行以下配置步骤,确保中间件在路由注册前加载:

  1. 导入中间件:在创建 FastAPI 实例的文件中,从 fastapi.middleware.cors 导入 CORSMiddleware。
  2. 配置允许源:设置 allow_origins 参数为前端域名的列表,若需支持多环境可读取环境变量。
  3. 设置凭据策略:若前端请求需要携带 Cookie 或 Authorization 头,将 allow_credentials 设为 True。
  4. 放行方法与头:根据实际业务设置 allow_methods 和 allow_headers,开发环境可用通配符,生产环境建议限定具体值。

怎么验证是否生效

通过浏览器开发者工具或 curl 命令检查响应头:

FastAPI 集成 RAG 接口如何设置 CORS 跨域配置?
  1. 打开浏览器开发者工具,切换到 Network 标签页。
  2. 刷新页面触发 RAG 接口请求,查看该请求的 Response Headers。
  3. 确认存在 Access-Control-Allow-Origin 且值为当前前端域名。
  4. 若允许凭据,确认存在 Access-Control-Allow-Credentials: true。

常见坑

  • 通配符与凭据冲突:allow_origins 设置为 ["*"] 时,allow_credentials 必须为 False,否则启动报错。
  • 中间件顺序:CORSMiddleware 应添加在其他可能处理请求的中间件之前,确保优先拦截跨域检查。
  • localhost 端口差异:http://localhost:3000 与 http://localhost:8000 视为不同源,需分别配置。

常见问题

允许所有域名怎么配置?

将 allow_origins 设置为 ["*"],但此时 allow_credentials 必须为 False,否则无法通过验证。

为什么 OPTIONS 请求返回 405?

CORS 中间件会自动处理 OPTIONS 预检请求,若被其他路由拦截需检查路由顺序或中间件加载位置。

生产环境可以直接用通配符吗?

不建议,生产环境应明确列出受信任的前端域名,防止恶意站点利用接口权限。

参考来源

  • FastAPI 官方文档,CORS 配置教程,https://fastapi.tiangolo.com/tutorial/cors/