CORS(跨域资源共享)¶
CORS 或 "跨域资源共享" 指的是当浏览器中运行的前端有 JavaScript 代码与后端通信,而后端与前端位于不同的 "源" 时的情况。
源¶
源是协议(http
、https
)、域名(myapp.com
、localhost
、localhost.tiangolo.com
)和端口(80
、443
、8080
)的组合。
因此,这些都是不同的源:
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 方法(
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。