当前位置: 首页 > article >正文

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

默认情况下,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 CORSMiddlewareapp = 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 CORSMiddlewareapp = 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中通过中间件方式灵活实现。

相关文章:

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

默认情况下,FastAPI应用程序不允许来自不同来源的请求。当你有一个前端应用程序与后端API通信,并且它们托管在不同的域或端口上时,在FastAPI中允许来自不同来源的请求是一种常见的场景。这被称为CORS(跨域资源共享)&am…...

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

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

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化 1. ollama安装1.1 linux安装1.2 windows安装2. deepSeek支持的7种蒸馏模型2.1 蒸馏模型介绍2.2 7种模型特点2.3 安装deepseek-r1:14b模型3. openwebui图形化页面安装4. java连接大模型的三…...

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

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

鸿蒙HarmonyOS 开发简介

鸿蒙开发入门教程 一、技术简介 鸿蒙操作系统(HarmonyOS)是面向万物互联时代的全场景分布式操作系统,具备分布式软总线、分布式数据管理、分布式任务调度等核心能力,能让设备间实现无缝连接与协同,为用户提供统一、流…...

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

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

谈谈 Node.js 中的文件系统(fs)模块,如何进行文件读写操作?

Node.js 文件系统(fs)模块深度解析与实践指南 一、模块基础与核心能力 Node.js 的 fs 模块提供了完整的文件系统操作能力,涵盖 50 个方法,主要分为以下类型: 文件读写:基础 CRUD 操作目录操作&#xff1…...

Python Cookbook-2.18 从指定的搜索路径寻找文件

任务 给定一个搜索路径(一个描述目录信息的字符串),需要根据这个路径和请求的文件名找到第一个符合要求的文件。 解决方案 需要循环指定的搜索路径中的目录: import os def search_file(filename,search path,pathsepos.pathsep): """…...

安装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…...

DMA发送全部历史记录数据到串口

背景 博主参与的项目中,有个读取全部历史记录的功能,如果下位机在主程序中将全部历史记录单纯地通过串口传输会比较占用cpu资源,影响主程序中别的功能。最后商量得出以下实现方案: 定义两个发送缓冲区DMATxbuf1和DMATxbuf2&…...

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

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

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

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

c++中迭代器和指针有什么区别?

在 C 中,迭代器和指针虽然在某些场景下有相似的行为,但它们在设计目的、功能和使用场景上有本质区别。以下是详细对比和最佳实践: 一、核心区别对比表 特征指针迭代器本质原生数据类型,直接存储内存地址类对象,抽象容…...

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...

CTF-web: Rust 的过程宏

Rust 的过程宏(Procedural Macros)是一种强大的元编程工具,允许你在编译时对代码进行操作和生成。与属性宏和派生宏不同,过程宏可以接收并处理任意 Rust 代码,生成新的代码片段。这里有一个简单的例子来说明 Rust 的过…...

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

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

Windows 11 下正确安装 Docker Desktop 到 D 盘的完整教程

文章目录 Windows 11 在 D 盘正确安装 Docker Desktop 的完整教程**前言****准备工作****1. 手动创建 Docker 相关目录**(⚠️ **这一步非常重要**,否则会报错)**2. 下载 Docker Desktop 安装程序****3. 使用管理员权限打开终端** **安装 Doc…...

锐评当前主流的各大编程语言

喵~ 让本喵来爪爪锐评一波编程语言吧!(ฅ•ω•ฅ)✧ 🐍 Python “简单到能拿爪子写代码喵~” 但缩进强迫症克星!写起来像在撸猫,跑起来…有时候像猫主子突然打翻水杯(GIL锁警告)~ 库多到能埋人&#xff0…...

2.数据结构:1.Tire 字符串统计

1.Tire 字符串统计 #include<algorithm> #include<cstring> #include<iostream>using namespace std;const int N100010; int son[N][26];//至多 N 层&#xff0c;每一层至多 26 个节点&#xff08;字母&#xff09; int cnt[N];//字符串至多 N 个&#xff…...

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

Section I Use of English&#xff08;完型填空&#xff09; 原题 Directions&#xff1a;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模型训练好以后&#xff0c;检测结果mAP结果很低&#xff0c;视频检测结果很差&#xff0c;于是想到改进网络&#xff0c;这里介绍改进主干网络。 2.demo引入 2.1代码 # File: 2…...