0%

FastAPI自学教程(41) - CORS(跨域资源共享)

1.基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
"http://localhost.tiangolo.com",
"https://localhost.tiangolo.com",
"http://localhost",
"http://localhost:8080",
]

app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

@app.get("/")
async def main():
return {"message": "Hello World"}
  • 使用CORSMiddleware中间件处理跨域请求
  • 通过allow_origins配置允许的源列表,支持具体域名或通配符*
  • 请求流程:
      graph TD
      A[浏览器发送OPTIONS预检请求] --> B{源是否允许?}
      B -->|是| C[返回CORS响应头]
      C --> D[发送实际请求]
      B -->|否| E[拒绝请求]

2.配置参数详解

核心参数:

  • allow_origins:允许的源列表(如["http://example.org"]),默认仅允许同源
  • allow_origin_regex:使用正则匹配允许的源(如"https://.*\.example\.org"
  • allow_methods:允许的HTTP方法,默认仅允许GET请求
  • allow_headers:允许的请求头,默认仅支持基础头(Content-Type等)
  • allow_credentials:是否允许携带Cookie/授权头(需显式指定源)
  • expose_headers:允许浏览器访问的响应头
  • max_age:预检请求缓存时间(秒),默认600秒

生产环境建议:

  • 避免使用allow_origins=["*"],显式指定可信源
  • 限制allow_methods为必要方法(如GET/POST)
  • 使用allow_origin_regex代替通配符提升安全性

3.注意事项

  1. 通配符限制:使用*时无法携带凭证(如Cookie/Token)
  2. 预检请求:浏览器自动发送OPTIONS请求验证CORS配置
  3. 中间件顺序:CORSMiddleware应在其他中间件之前注册
  4. HTTPS要求:生产环境必须启用HTTPS保护敏感数据
  5. 错误处理:无效CORS配置会触发浏览器控制台警告

测试命令示例:

1
curl -X OPTIONS -H "Origin: http://localhost:8080" http://localhost:8000/