CORS(跨域资源共享)¶
CORS 或 "跨域资源共享" 指的是当浏览器中运行的前端有 JavaScript 代码与后端通信,而后端与前端位于不同的 "源" 时的情况。
源¶
源是协议(http、https)、域名(myapp.com、localhost、localhost.tiangolo.com)和端口(80、443、8080)的组合。
因此,这些都是不同的源:
http://localhosthttps://localhosthttp://localhost:8080
即使它们都在 localhost 上,它们使用了不同的协议或端口,所以它们是不同的 "源"。
步骤¶
假设你有一个前端在浏览器中运行在 http://localhost:8080,其 JavaScript 试图与运行在 http://localhost 的后端通信(因为我们没有指定端口,浏览器会假设默认端口 80)。
然后,浏览器会向 :80 后端发送一个 HTTP OPTIONS 请求,如果后端发送了适当的头信息授权来自这个不同源(http://localhost:8080)的通信,那么 :8080 浏览器将允许前端的 JavaScript 向 :80 后端发送请求。
为此,:80 后端必须有一个 "允许的源" 列表。
在这种情况下,列表必须包含 http://localhost:8080,以便 :8080 前端正常工作。
通配符¶
也可以将列表声明为 "*"(一个 "通配符"),表示所有源都被允许。
但这只会允许某些类型的通信,排除所有涉及凭证的内容:Cookies、Authorization 头信息(如使用 Bearer Token 时)等。
因此,为了使一切正常工作,最好明确指定允许的源。
使用 CORSMiddleware¶
你可以使用 CORSMiddleware 在你的 FastAPI 应用程序中进行配置。
- 导入
CORSMiddleware。 - 创建一个允许的源列表(作为字符串)。
- 将其作为 "中间件" 添加到你的 FastAPI 应用程序中。
你还可以指定你的后端是否允许:
- 凭证(Authorization 头信息、Cookies 等)。
- 特定的 HTTP 方法(
POST、PUT)或所有方法使用通配符"*"。 - 特定的 HTTP 头信息或所有头信息使用通配符
"*"。
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- 应允许进行跨域请求的源列表。例如['https://example.org', 'https://www.example.org']。你可以使用['*']允许任何源。allow_origin_regex- 一个正则表达式字符串,用于匹配应允许进行跨域请求的源。例如'https://.*\.example\.org'。allow_methods- 应允许用于跨域请求的 HTTP 方法列表。默认为['GET']。你可以使用['*']允许所有标准方法。allow_headers- 应支持用于跨域请求的 HTTP 请求头信息列表。默认为[]。你可以使用['*']允许所有头信息。Accept、Accept-Language、Content-Language和Content-Type头信息始终允许用于 简单 CORS 请求。allow_credentials- 指示是否应支持跨域请求的 Cookies。默认为False。此外,allow_origins不能设置为['*']以允许凭证,必须指定源。expose_headers- 指示应向浏览器公开的任何响应头信息。默认为[]。max_age- 设置浏览器缓存 CORS 响应的最大时间(以秒为单位)。默认为600。
中间件响应两种特定类型的 HTTP 请求...
CORS 预检请求¶
这些是带有 Origin 和 Access-Control-Request-Method 头信息的任何 OPTIONS 请求。
在这种情况下,中间件将拦截传入的请求并响应适当的 CORS 头信息,并返回 200 或 400 响应以供信息参考。
简单请求¶
任何带有 Origin 头信息的请求。在这种情况下,中间件将正常传递请求,但在响应中包含适当的 CORS 头信息。
更多信息¶
有关 CORS 的更多信息,请查看 Mozilla CORS 文档。
"技术细节"
你也可以使用 from starlette.middleware.cors import CORSMiddleware。
FastAPI 在 fastapi.middleware 中提供了几种中间件,只是为了方便你,开发者。但大多数可用的中间件直接来自 Starlette。