為何在 FastAPI 中需要允許跨域訪問(CORS)?(Grok3 回答)

prompt: 你是一個文筆流暢、專業性極強的技術博客博主,你將結合具體的例子和實際代碼解釋寫一篇為何后端選擇fastapi框架時,需要允許跨域訪問。

為何在 FastAPI 中需要允許跨域訪問(CORS)?

在現代 Web 開發中,前后端分離已經成為主流架構模式。前端通常運行在瀏覽器中(例如通過 React、Vue.js 或 Angular 構建的單頁應用),而后端則通過 API 提供數據支持,比如使用 Python 的 FastAPI 框架構建的高性能 RESTful 接口。然而,當前端和后端部署在不同的域名、端口或協議下時,瀏覽器會觸發一種安全機制——同源策略(Same-Origin Policy),阻止前端直接訪問后端 API。這時,我們需要在后端啟用跨域資源共享(CORS,Cross-Origin Resource Sharing),以確保前后端能夠正常通信。

本文將深入探討為何在 FastAPI 中需要配置 CORS,并通過具體場景和代碼示例展示如何實現。

一、同源策略與跨域問題

瀏覽器的同源策略規定,只有當協議(protocol)、域名(domain)和端口(port)完全一致時,兩個資源才被視為“同源”。例如:

  • http://localhost:3000http://localhost:8000:端口不同,非同源。
  • http://example.comhttps://example.com:協議不同,非同源。
  • http://app.example.comhttp://api.example.com:域名不同,非同源。

假設你使用 FastAPI 在 http://localhost:8000 上運行一個后端服務,而前端應用運行在 http://localhost:3000(比如一個 React 項目)。當前端通過 fetchaxios 發起請求時,瀏覽器會檢測到“跨域”行為,默認阻止請求,并拋出類似以下的錯誤:

Access to fetch at 'http://localhost:8000/api/data' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

這是因為后端沒有明確告訴瀏覽器允許來自 http://localhost:3000 的請求。為了解決這個問題,我們需要在 FastAPI 中啟用 CORS。

二、FastAPI 與 CORS 的關系

FastAPI 是一個基于 Python 的現代化、高性能 Web 框架,內置了對異步編程的支持,非常適合構建 RESTful API。然而,FastAPI 本身并不會默認啟用 CORS,因為它無法預知你的前端部署在哪里、需要允許哪些來源訪問。為了讓前端能夠順利調用 API,我們需要手動配置 CORS。

幸運的是,FastAPI 提供了與 Starlette 中間件集成的便捷方式,通過 CORSMiddleware 可以輕松實現跨域支持。

三、實際場景:前后端分離的典型案例

假設你正在開發一個任務管理應用:

  • 前端:使用 React 構建,運行在 http://localhost:3000,通過 API 獲取任務列表。
  • 后端:使用 FastAPI 構建,運行在 http://localhost:8000,提供 /tasks 接口返回任務數據。

如果不配置 CORS,前端發起請求時會失敗。為了讓這個應用正常工作,我們需要在 FastAPI 中允許來自 http://localhost:3000 的跨域請求。

四、代碼示例:如何在 FastAPI 中啟用 CORS

以下是一個完整的 FastAPI 示例,展示了如何配置 CORS:

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware# 創建 FastAPI 應用實例
app = FastAPI()# 配置允許的來源(origins)
origins = ["http://localhost:3000",  # 前端應用的地址"http://localhost:5173",  # 比如使用 Vite 時的默認端口"https://your-production-domain.com",  # 生產環境的前端域名
]# 添加 CORS 中間件
app.add_middleware(CORSMiddleware,allow_origins=origins,  # 允許訪問的來源allow_credentials=True,  # 是否允許攜帶憑證(如 Cookies)allow_methods=["*"],     # 允許的 HTTP 方法(如 GET、POST)allow_headers=["*"],     # 允許的 HTTP 頭
)# 示例接口:返回任務列表
@app.get("/tasks")
async def get_tasks():return [{"id": 1, "title": "學習 FastAPI"},{"id": 2, "title": "配置 CORS"}]# 運行應用
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

代碼解釋

  1. 導入 CORSMiddleware:FastAPI 通過 Starlette 提供的 CORSMiddleware 處理跨域請求。
  2. 定義 originsallow_origins 指定了哪些域名可以訪問后端 API。可以是具體域名,也可以設置為 ["*"](允許所有來源,但安全性較低)。
  3. 配置中間件
    • allow_credentials=True:支持攜帶 Cookies 或認證頭。
    • allow_methods=["*"]:允許所有 HTTP 方法(如 GET、POST、PUT 等)。
    • allow_headers=["*"]:允許所有請求頭。
  4. 接口實現/tasks 接口返回一個簡單的任務列表。
五、在前端驗證

假設前端使用 JavaScript 的 fetch 調用 API:

fetch("http://localhost:8000/tasks").then(response => response.json()).then(data => console.log(data)).catch(error => console.error("Error:", error));

在配置 CORS 之前,瀏覽器會報錯。配置完成后,前端將成功接收到后端返回的任務數據:

[{ "id": 1, "title": "學習 FastAPI" },{ "id": 2, "title": "配置 CORS" }
]
六、生產環境中的注意事項

在開發環境中,允許 http://localhost:3000 是可以的。但在生產環境中,你需要:

  1. 精確指定域名:將 origins 更新為實際的前端域名(如 https://your-app.com),避免使用 ["*"],以提高安全性。
  2. HTTPS 支持:確保后端支持 HTTPS,瀏覽器在跨域請求中通常要求安全協議。
  3. 動態配置:如果允許多個前端域名訪問,可以從配置文件或環境變量中讀取 origins
七、總結

在 FastAPI 中啟用 CORS 是前后端分離開發中的必要步驟,因為瀏覽器的同源策略限制了跨域請求。通過 CORSMiddleware,我們可以靈活地控制哪些來源、方法和頭被允許訪問后端 API。無論是開發階段的本地測試,還是生產環境的部署,合理配置 CORS 都能確保前端與后端無縫協作。

希望這篇文章和代碼示例能幫助你更好地理解 FastAPI 中的跨域問題。如果有更多疑問,歡迎留言討論!


這篇文章以技術博客的風格,結合場景、代碼和注意事項,清晰地解釋了為何需要 CORS 以及如何實現。如果你需要調整某些部分(比如更深入的技術細節或不同的示例),請告訴我!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/76262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/76262.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/76262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JDK8前后日期(計算兩個日期時間差-高考倒計時)

JDK8之前日期、時間 Date SimpleDateFormat Calender JDK8開始日期、時間 LocalDate/LocalTime/LocalDateTime ZoneId/ZoneDateTIme Instant-時間毫秒值 DateTimeFormatter Duration/Period

Gerapy二次開發:用戶管理專欄主頁面開發

用戶管理專欄主頁面開發 寫在前面用戶權限控制用戶列表接口設計主頁面開發前端account/Index.vuelangs/zh.jsstore.js后端Paginator概述基本用法代碼示例屬性與方法urls.pyviews.py運行效果總結歡迎加入Gerapy二次開發教程專欄! 本專欄專為新手開發者精心策劃了一系列內容,旨…

關于Spring MVC中傳遞數組參數的詳細說明,包括如何通過逗號分隔的字符串自動轉換為數組,以及具體的代碼示例和總結表格

以下是關于Spring MVC中傳遞數組參數的詳細說明,包括如何通過逗號分隔的字符串自動轉換為數組,以及具體的代碼示例和總結表格: 1. 核心機制 Spring MVC支持直接通過逗號分隔的字符串將請求參數自動轉換為數組(String[]、int[]等&…

大模型學習七:?小米8閑置,直接安裝ubuntu,并安裝VNC遠程連接手機,使勁造

一、說明 對于咱們技術人來說,就沒有閑的蛋疼的時候,那不是現在機會來了 二、刷機器準備 1、申請解鎖手機 申請解鎖小米手機https://www.miui.com/unlock/download.html 下載工具,安裝下面的步驟來,官網不欺人吧 打開開發者工…

repo安裝配置

1.安裝屬性 以下配置方式二選一進行安裝 1.1全局級別配置 1. 安裝 repo 工具 在終端中輸入以下命令以下載 repo 工具: curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo chmod ax /usr/bin/repo 1.2用戶級別配置 1. 安裝 r…

Go 語言數據類型

Go 語言數據類型 概述 Go 語言(也稱為 Golang)是一種靜態強類型、編譯型、并發型、具有垃圾回收功能的編程語言。自2009年發布以來,Go 語言因其簡潔的語法、高效的執行速度和強大的并發處理能力而廣受歡迎。本文將詳細介紹 Go 語言中的數據類型,幫助讀者更好地理解和掌握…

C# 看門狗策略實現

using System; using System.Threading;public class Watchdog {private Timer _timer;private volatile bool _isTaskAlive;private readonly object _lock new object();private const int CheckInterval 5000; // 5秒檢測一次private const int TimeoutThreshold 10000; …

Font Awesome Web 應用圖標

1. 什么是 Font Awesome Web 應用圖標 Font Awesome Web 應用圖標是 Font Awesome 圖標庫中與 Web 開發相關的子集,適用于界面設計、用戶交互和功能標識。 定義與作用 定義:這些圖標包括導航(如“主頁”)、操作(如“…

如何實現H5端對接釘釘登錄并優雅擴展其他平臺

如何實現H5端對接釘釘登錄并優雅擴展其他平臺 釘釘H5登錄邏輯后端代碼如何實現?本次采用策略模式工廠方式進行定義接口確定會使用的基本鑒權步驟具體邏輯類進行實現采用注冊表模式(Registry Pattern)抽象工廠進行基本邏輯定義具體工廠進行對接…

STM32F103C8T6單片機開發:簡單說說單片機的外部GPIO中斷(標準庫)

目錄 前言 如何使用STM32F1系列的標準庫完成外部中斷的抽象 初始化我們的GPIO為輸入的一個模式 初識GPIO復用,開啟GPIO的復用功能時鐘 GPIO_EXTILineConfig和EXTI_Init配置外部中斷參數 插入一個小知識——如何正確的配置結構體? 初始化中斷&#…

【自然語言處理】深度學習中文本分類實現

文本分類是NLP中最基礎也是應用最廣泛的任務之一,從無用的郵件過濾到情感分析,從新聞分類到智能客服,都離不開高效準確的文本分類技術。本文將帶您全面了解文本分類的技術演進,從傳統機器學習到深度學習,手把手實現一套…

Java Lambda與方法引用:函數式編程的顛覆性實踐

在Java 8引入Lambda表達式和方法引用后,函數式編程范式徹底改變了Java開發者的編碼習慣。本文將通過實戰案例和深度性能分析,揭示如何在新項目中優雅運用這些特性,同時提供傳統代碼與函數式代碼的對比優化方案。 文章目錄 一、Lambda表達式&a…

劍指offer經典題目(三)

目錄 動態規劃入門 二進制運算 鏈表相關 動態規劃入門 題目1:一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先后次序不同算 不同的結果)。OJ地址 簡單圖示如下。 題目分析&#…

【每日隨筆】叢林法則 ( 弱肉強食 | 適者生存 | 資源有限稀缺 | 沒有道德約束 | 自發性與無序性 | 叢林法則映射 - 資源分配 與 社會分層 )

文章目錄 一、叢林法則1、弱肉強食2、適者生存3、資源有限稀缺4、沒有道德約束5、自發性與無序性6、叢林法則映射 - 資源分配 與 社會分層 一、叢林法則 叢林法則 是 在 資源有限 的環境中 , 競爭 是生存的基礎 , 弱肉強食 , 適者生存 , 且過程 不受道德約束 ; 叢林法則 在 自…

【含文檔+PPT+源碼】基于小程序的智能停車管理系統設計與開發

項目視頻介紹: 畢業作品基于小程序的智能停車管理系統設計與開發 課程簡介: 本課程演示的是一款基于小程序的智能停車管理系統設計與開發,主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含:…

Navicat連接遠程PostGreSQL失敗

問題描述 使用本地Navicat連接Windows遠程服務器上部署的PostGreSQL數據庫時,出現以下錯誤: 解決方案 出現以上報錯信息,是因為PostGreSQL數據庫服務尚未設置允許客戶端建立遠程連接。可做如下配置, 1. 找到PostGreSQL數據庫安裝目錄下的data子文件夾,重點關注:postgres…

【Linux】jumpserver開源堡壘機部署

JumpServer 安裝部署指南 本文檔詳細記錄了 JumpServer 安裝部署的過程、核心腳本功能說明以及后續管理使用提示,方便運維人員快速查閱和二次安裝。 1. 前提條件 操作系統要求: 僅支持 Linux 系統,不支持 Darwin(macOS&#xff0…

餐飲廚房開源監控安全系統的智能革命

面對日益嚴格的合規要求和消費者對衛生的信任危機,傳統人工監督已力不從心:衛生死角難發現、違規操作難追溯、安全隱患防不勝防。如何讓后廚更透明、更安全、更可信?餐飲廚房視頻安全系統橫空出世!這套系統融合實時監控與AI技術&a…

HashMap為什么擴容為原來2倍呢?

1、減少哈希碰撞 核心原因:HashMap的所有設計都依賴于數組長度為2的冪次方這一前提。 索引計算使用 (n-1)&hash ,其中 n 是數組長度當 n 是 2 的冪次方時,n-1 的二進制形式是全 1(例如,15——>111…

debian系統中文輸入法失效解決

在 Debian 9.6 上無法切換中文輸入法的問題通常與輸入法框架(如 Fcitx 或 IBus)的配置或依賴缺失有關。以下是詳細的解決步驟: 1. 安裝中文語言包 確保系統已安裝中文語言支持: sudo apt update sudo apt install locales sudo…