Skip to content

CORS(跨域资源共享)

CORS 或 "跨域资源共享" 指的是当浏览器中运行的前端有 JavaScript 代码与后端通信,而后端与前端位于不同的 "源" 时的情况。

源是协议(httphttps)、域名(myapp.comlocalhostlocalhost.tiangolo.com)和端口(804438080)的组合。

因此,这些都是不同的源:

  • http://localhost
  • https://localhost
  • http://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 方法(POSTPUT)或所有方法使用通配符 "*"
  • 特定的 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 请求头信息列表。默认为 []。你可以使用 ['*'] 允许所有头信息。AcceptAccept-LanguageContent-LanguageContent-Type 头信息始终允许用于 简单 CORS 请求
  • allow_credentials - 指示是否应支持跨域请求的 Cookies。默认为 False。此外,allow_origins 不能设置为 ['*'] 以允许凭证,必须指定源。
  • expose_headers - 指示应向浏览器公开的任何响应头信息。默认为 []
  • max_age - 设置浏览器缓存 CORS 响应的最大时间(以秒为单位)。默认为 600

中间件响应两种特定类型的 HTTP 请求...

CORS 预检请求

这些是带有 OriginAccess-Control-Request-Method 头信息的任何 OPTIONS 请求。

在这种情况下,中间件将拦截传入的请求并响应适当的 CORS 头信息,并返回 200400 响应以供信息参考。

简单请求

任何带有 Origin 头信息的请求。在这种情况下,中间件将正常传递请求,但在响应中包含适当的 CORS 头信息。

更多信息

有关 CORS 的更多信息,请查看 Mozilla CORS 文档

"技术细节"

你也可以使用 from starlette.middleware.cors import CORSMiddleware

FastAPIfastapi.middleware 中提供了几种中间件,只是为了方便你,开发者。但大多数可用的中间件直接来自 Starlette。