FastAPI系列:如何配置跨域访问(CORS)

news2025/5/17 11:28:44

默认情况下,FastAPI应用程序不允许来自不同来源的请求。当你有一个前端应用程序与后端API通信,并且它们托管在不同的域或端口上时,在FastAPI中允许来自不同来源的请求是一种常见的场景。这被称为CORS(跨域资源共享),它需要一些配置才能正常工作。这篇实用的文章将向您展示如何在FastAPI中启用CORS。让我们卷起袖子向前走吧!

介绍CORS

CORS(跨来源资源共享,Cross-Origin Resource Sharing) 是一种浏览器机制,用于控制网页从一个源(域、协议和端口)向另一个源请求资源的安全策略。CORS 允许服务器在响应头中设置特定的 HTTP 头(如 Access-Control-Allow-Origin),以指示浏览器允许哪些跨域请求。
在这里插入图片描述

同源策略简介

在深入理解 CORS 之前,首先需要了解同源策略。同源策略是浏览器的一种安全机制,限制了来自不同源的文档或脚本之间的交互。两个 URL 如果协议、域名和端口都相同,则认为是同源;否则,即为跨源。

同源策略的目的

  • 防止恶意网站读取或篡改其他网站的数据。
  • 保护用户的隐私和安全。

CORS 的工作原理

当一个网页向不同源的服务器发送请求时,浏览器会自动添加一个 Origin 头,指示请求的来源。服务器根据 Origin 头决定是否允许该请求,并在响应中添加 Access-Control-Allow-Origin 头。

主要步骤

  1. 预检请求(Preflight Request):对于某些跨域请求(如带有自定义头部、使用非简单方法如 PUTDELETE),浏览器会先发送一个 OPTIONS 请求,询问服务器是否允许该跨域请求。
  2. 服务器响应:服务器在响应中包含 Access-Control-Allow-Origin 等相关头部,指示浏览器是否允许该请求。
  3. 实际请求:如果预检通过,浏览器会发送实际的跨域请求,并根据服务器的响应决定是否处理返回的数据。
    在这里插入图片描述

CORS 相关的 HTTP 头

  • Access-Control-Allow-Origin

    • 指定允许访问资源的源。可以使用具体的域名(如 https://example.com)或 * 表示允许所有源。

    • 示例:

      Access-Control-Allow-Origin: https://example.com
      
  • Access-Control-Allow-Methods

    • 指定允许的 HTTP 方法(如 GET, POST, PUT)。

    • 示例:

      Access-Control-Allow-Methods: GET, POST, PUT
      
  • Access-Control-Allow-Headers

    • 指定允许的自定义请求头。

    • 示例:

      Access-Control-Allow-Headers: Content-Type, Authorization
      
  • Access-Control-Allow-Credentials

    • 指示是否允许发送凭证信息(如 Cookies)。当设置为 true 时,Access-Control-Allow-Origin 不能使用 *

    • 示例:

      Access-Control-Allow-Credentials: true
      

CORS 的类型

  1. 简单请求(Simple Request)
    • 使用 GETPOSTHEAD 方法。
    • 仅使用 AcceptAccept-LanguageContent-LanguageContent-Type(仅限 application/x-www-form-urlencodedmultipart/form-datatext/plain)等头。
    • 不需要预检请求。
  2. 预检请求(Preflighted Request)
    • 不属于简单请求的情况,如使用 PUTDELETE 方法,或包含自定义头部。
    • 需要先发送 OPTIONS 请求,询问服务器是否允许该跨域请求。

CORS 的优缺点

优点

  • 提高了 Web 应用的灵活性,允许不同源之间的资源交互。
  • 支持现代 Web 开发中的许多功能,如第三方 API 调用、CDN 资源加载等。

缺点

  • 增加了复杂性,需要服务器端正确配置响应头。
  • 可能带来安全隐患,如果配置不当,可能导致跨站请求伪造(CSRF)等攻击。

CORSMiddleware中间件

FastApi中可以启用CORS的最佳方法是使用cor中间件模块。该模块允许您指定API将从跨域请求中接受的允许的源、方法、头和凭据列表。您还可以使用通配符(*)来允许所有的起源、方法或头,但出于安全原因不建议这样做。

一般来说,设置CORS的步骤如下:

  • 从fastapi.middleware.cors导入CORSMiddleware 中间件
  • 创建一个允许的请求源的列表(作为字符串)
  • 使用app.add_middleware()方法将CORSMiddleware作为中间件添加到FastAPI应用程序中
  • 将允许的请求源列表和想要配置的任何其他参数(例如allow_credentials, allow_methods或allow_headers)传递给中间件。

让我们看一下下面的例子,以便更清楚地了解。

允许来自域列表的请求

在这个例子中,我们限制FastAPI只接受来自特定来源的传入请求,方法和头的数量有限。

示例代码:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

# Allow these origins to access the API
origins = [
    "http://localhost",
    "https://localhost:3000",
    "https://tools.domain.com",
    "https://www.domain.com",
]

# Allow these methods to be used
methods = ["GET", "POST", "PUT", "DELETE"]

# Only these headers are allowed
headers = ["Content-Type", "Authorization"]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=methods,
    allow_headers=headers,
)

@app.get("/")
async def main():
    return {"message": "Welcome to My Home"}

允许来自任何域的请求

在某些情况下,特别是在开发和测试软件时,你可能希望从API中删除任何限制。下面的代码演示了如何做到这一点:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


@app.get("/")
async def main():
    return {"message": "Welcome to Sling Academy"}

最后总结

本文介绍了CORS,以及如何在FastApi中通过中间件方式灵活实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2307885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 目录 Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 一、简单介绍 二、简单介绍 camera 三、安装 camera 四、简单案例实现 五、关键代码 一、简单…

【Vue3 Teleport 技术解析:破解弹窗吸附与滚动列表的布局困局】

🌟 Vue3 Teleport 技术解析:破解弹窗吸附与滚动列表的布局困局 🌍 背景:传统组件嵌套的布局之痛 在传统前端开发中,组件往往被严格限制在父级 DOM 结构中,这导致三大典型问题: 层级监禁 &…

VBA技术资料MF276:在集合中使用键

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

安装Git(小白也会装)

一、官网下载:Git 1.依次点击(红框) 不要安装在C盘了,要炸了!!! 后面都 使用默认就好了,不用改,直接Next! 直到这里,选第一个 这两种选项的区别如…

前端正则表达式完全指南:从入门到实战

文章目录 第一章:正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章:正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章:前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…

Chromium项目相关

Chromium项目相关 Chromium 是一个开源浏览器项目,旨在为所有用户构建一种更安全、更快速、更稳定的方式来体验 Web。 自 Google 在 2008 年宣布 Chromium 项目以来,他们一直很高兴能够在开源 Web 浏览器的良好基础上进行构建,并为富 Web 平…

自动驾驶测试场景相关概念

自动驾驶测试场景 一、概念二、分类2.1、按照场景的抽象程度可分为:功能场景、逻辑场景、具体场景。2.2.、​按功能划分2.3、 ​按环境复杂度2.3、按场景类型 三、要素四、挑战与趋势4.1、长尾场景覆盖​4.2、伦理决策测试​4.3、车路协同测试​4.4、联邦学习驱动​…

给小白的oracle优化工具,了解一下

有时懒得分析或语句太长,可以尝试用oracle的dbms_sqldiag包进行sql优化, --How To Use DBMS_SQLDIAG To Diagnose Query Performance Issues (Doc ID 1386802.1) --诊断SQL 性能 SET ECHO ON SET LINESIZE 132 SET PAGESIZE 999 SET LONG 999999 SET SER…

基因型—环境两向表数据分析——品种生态区划分

参考资料:农作物品种试验数据管理与分析 用于品种生态区划分的GGE双标图有两种功能图:试点向量功能图和“谁赢在哪里”功能图。双标图的具体模型基于SD定标和h加权和试点中心化的数据。本例中籽粒产量的GGE双标图仅解释了G和GE总变异的53.6%,…

电路中如何计算电容容值大小

一个例题: 【电路中电容容值是怎么算出来的?】https://www.bilibili.com/video/BV1RQ4y1c7i1?vd_source3cc3c07b09206097d0d8b0aefdf07958

GPT大语言模型与搜索引擎:技术本质与应用场景的深度解析

引言 在人工智能和自然语言处理(NLP)领域,GPT(Generative Pre-trained Transformer)大语言模型和搜索引擎是两个备受关注的技术。尽管它们都涉及到信息检索和生成,但它们在技术原理、应用场景和用户体验上…

FreeRTOS-中断管理

实验目的 创建一个队列及一个任务,按下按键 KEY1 触发中断,在中断服务函数里向队列里发送数据,任务则阻塞接 收队列数据。 实验代码 实验结果 这样就实现了,使用中断往队列的发送信息,用任务阻塞接收信息

计算机毕业设计SpringBoot+Vue.js音乐网站(源码+文档+PPT+讲解)

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

更换k8s容器运行时环境为docker

更换k8s容器运行时环境为docker k8s-V1.24之后容器运行时默认是containerd,若想改为熟悉的docker作为运行时,需要做以下操作 在每个节点安装containerd、docker; 每个节点安装cri-docker; 调整kubelet配置并重启验证。 1.安装docker、con…

知识图谱-资源网

知识图谱-资源网 http://openkg.cn/datasets-type/https://www.ownthink.com/knowledge.html

小程序Three Dof识别 实现景区AR体验

代码工程 GitCode - 全球开发者的开源社区,开源代码托管平台 dof

2020 年英语(一)考研真题 笔记(更新中)

Section I Use of English(完型填空) 原题 Directions:Read the following text. Choose the best word (s) for each numbered blank and mark A, B, C or D on the ANSWER SHEET. (10 points) Even if families are less likely to si…

YOLO11改进加入ResNet网络

文章目录 1.改进目的2.demo引入2.1代码2.2 结果展示2.3 BottleNeck详解 1.改进目的 原始YOLO11模型训练好以后,检测结果mAP结果很低,视频检测结果很差,于是想到改进网络,这里介绍改进主干网络。 2.demo引入 2.1代码 # File: 2…

硬编码(三)经典变长指令一

我们在前两节的硬编码中学习了定长指令,接下来学习变长指令 对于定长指令,我们通过opcode便可知该指令的长度,但是对于变长指令却是不可知的。变长指令长度由opcode,ModR/M,SIB共同决定。变长指令通常在需要操作内存的…

在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案

离线 TTS 存在语音质量欠佳、音色选择有限、语言支持单一更新困难、占用资源多、适应性差、难以个性化定制等痛点 01更新维护困难 由于是离线模式,难以及时获取最新的语音数据和算法更新,无法得到持续改进。 02占用本地资源 需要在设备本地存储较大的…