FastApi教程|CORS(跨源资源共享)

发表时间:2020-03-09

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 )。

然后,浏览器将向 OPTIONS 后端 发送HTTP 请求,如果后端发送了适当的标头,以授权来自此不同来源( http://localhost:8080 ) 的通信, 则浏览器将让前端中的JavaScript将其请求发送至后端。

为此,后端必须具有“允许的来源”列表。

在这种情况下,必须包括 http://localhost:8080 前端才能正常工作。

通配符

也可以将列表声明为 "*" (“通配符”)以表示所有内容均被允许。

但这仅允许某些类型的通信,不包括涉及凭据的所有内容:Cookie,授权标头(如与Bearer令牌一起使用的标头)等。

因此,为了使一切正常工作,最好明确指定允许的来源。

使用 CORSMiddleware

您可以使用来在 FastAPI 应用程序中对其进行配置 CORSMiddleware

  • 导入 CORSMiddleware
  • 创建允许的来源列表(作为字符串)。
  • 将其作为“中间件”添加到 FastAPI 应用程序。

您还可以指定后端是否允许:

  • 凭证(授权标头,Cookie等)。
  • 特定的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 -表示跨域请求应支持cookie。 默认为 False
  • expose_headers -指出应使浏览器可以访问的所有响应标头。 默认为 []
  • max_age -设置浏览器缓存CORS响应的最长时间(以秒为单位)。 默认为 60

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

CORS飞行前请求

这些是 OPTIONS 带有 Origin Access-Control-Request-Method 标头的 任何 请求 。

在这种情况下,中间件将拦截传入的请求,并使用适当的CORS标头进行响应,并 出于信息目的而响应 200 400

简单的请求

任何带有 Origin 标头的 请求 。 在这种情况下,中间件将照常通过请求,但在响应上将包含适当的CORS标头。

更多信息

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

技术细节

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

FastAPI fastapi.middleware 为您(开发人员)的方便 提供了几种中间件 。 但是大多数可用的中间件直接来自Starlette。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free