fastapi 跨域请求
问题描述
在前后端开发中遇到一个问题,前端发送请求后,后端报 'OPTIONS /mock/user/login HTTP/1.1' 405 Method Not Allowed,如下图:
但用fastapi自带的swagger或postman测试又是可以的。
定位原因
这是因为在跨域的情况下,在浏览器发起"复杂请求"时主动发起的。跨域共享标准规范要求,对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨域请求 。服务器确认允许之后,才发起实际的 HTTP 请求。这也明明需要一个POST请求,但是实际浏览器发两次HTTP请求给服务器的原因。
解决方案
FastAPI提供了一个名为fastapi.middleware.cors
的中间件模块,可用来处理跨域问题。
from fastapi.middleware.cors import CORSMiddleware
from fastapi import FastAPI
app = FastAPI()
# 允许所有来源的跨域请求
app.add_middleware(
CORSMiddleware,
# 允许所有来源的跨域请求,你也可以设置为具体的域名来限制请求来源
allow_origins=["*"],
# 参数设置为True表示允许携带身份凭证,如cookies
allow_credentials=True,
# 表示允许所有HTTP方法的请求
allow_methods=["*"],
# 表示允许所有请求头
allow_headers=["*"]
)