【FastAPI】--3.進階教程(二)

【FastAPI】--進階教程1-CSDN博客

【FastAPI】--基礎教程-CSDN博客

目錄

1.FastAPI - CORS

?2.FastAPI - CRUD 操作

2.1.Create

2.2.Read

2.3.Update

2.4.Delete

3.FastAPI - 使用 GraphQL

4.FastAPI - Websockets

5.FastAPI - 事件處理程序

6.FastAPI - 安裝 Flask 應用程序


1.FastAPI - CORS

Cross-Origin Resource Sharing?(CORS) 是指在一個客戶端瀏覽器上運行的前端應用程序試圖通過 JavaScript 代碼與后端通信,而后端與前端位于不同的"來源"的情況。 這里的來源是協議、域名和端口號的組合。 因此,http://localhost 和 https://localhost 的來源不同。

  • 前端運行在?http://localhost:3000,后端運行在?http://localhost:8000
  • 瀏覽器會阻止前端直接訪問后端 API,除非后端配置了 CORS。

要明確指定允許的來源,請導入?CORSMiddleware?并將來源列表添加到應用程序的中間件。

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = ["http://192.168.211.:8000","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"}

以下是 ??FastAPI?app.add_middleware(CORSMiddleware)?參數?? 的詳細表格說明,涵蓋所有核心配置選項及其用途、示例和注意事項:


??CORS 中間件參數完整表格??

參數類型說明
??allow_origins??List[str]允許訪問的源(域名列表)。
??allow_origin_regex??str用正則表達式匹配允許的源。
??allow_methods??List[str]允許的 HTTP 方法。
??allow_headers??List[str]允許的請求頭。
??allow_credentials??bool是否允許跨域攜帶 Cookie(如?Authorization: Bearer)。
??expose_headers??List[str]允許前端 JavaScript 訪問的響應頭。
??max_age??int預檢請求(OPTIONS)的緩存時間(秒)。

?2.FastAPI - CRUD 操作

CRUD(Create, Read, Update, Delete)是 Web 開發中最基礎的操作。FastAPI 實現 CRUD 的完整示例??,包含 ??路由設計、請求驗證、數據庫交互?? 和 ??錯誤處理??。

(創、讀、更新、刪除)

REST 架構使用 HTTP 動詞或方法來對資源進行操作。 POST、GET、PUT和DELETE方法分別執行CREATE、READ、UPDATE和DELETE操作。

2.1.Create

在下面的示例中,我們將使用 Python 列表作為內存數據庫并對其執行 CRUD 操作。 首先,讓我們設置一個 FastAPI 應用程序對象并聲明一個名為?Book?的 Pydantic 模型。

from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
data = []
class Book(BaseModel):id: inttitle: strauthor: strpublisher: str#出版社@app.post("/book")
def add_book(book: Book):data.append(book.dict())return dataif __name__ == "__main__":import uvicornuvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

在Swagger UI中,執行幾次這個操作函數并添加一些數據。

2.2.Read

要檢索列表,定義綁定到?@app.get()?裝飾器的操作函數,如下所示 ?

@app.get("/list")
def get_books():return data

?要檢索一本書,其 id 作為路徑參數,定義 get() 操作裝飾器和 get_book() 函數如下 ?

@app.get("/book/{id}")
def get_book(id: int):id = id - 1return data[id]

2.3.Update

接下來,定義修改數據列表中對象的@app.put()裝飾器。 這個裝飾器也有一個 id 字段的路徑參數。

??在 FastAPI 中,@app.put()?用于定義 ??HTTP PUT 請求?? 的路由,通常用于 ??更新資源??。

@app.put("/book/{id}")
def add_book(id: int, book: Book):data[id] = bookreturn data

?

2.4.Delete

最后,我們定義了@app.delete() 裝飾器,用于刪除路徑參數對應的一個對象。

@app.delete("/book/{id}")
def delete_book(id: int):data.pop(id-1)return data

3.FastAPI - 使用 GraphQL

GraphQL 是一種用于 API 的 ??查詢語言?? 和 ??運行時??,由 Facebook 于 2012 年開發并在 2015 年開源。它提供了一種更高效、靈活且強類型的方式來與 API 交互,尤其適合現代復雜應用(如 React/Vue 前端、移動端等)。?

由于 GraphQL 與 ASGI 兼容,因此可以輕松地與 FastAPI 應用程序集成。 GraphQL 有很多 Python 庫。 下面列出了其中一些 ?

  • Strawberry

  • Ariadne

  • Tartiflette

  • Graphene

# 導入Strawberry庫(用于構建GraphQL服務)
import strawberry# 定義一個Book類型(GraphQL對象類型)
@strawberry.type
class Book:title: str      # 書名(字符串類型)author: str     # 作者(字符串類型)price: int      # 價格(整數類型)# 定義查詢入口點
@strawberry.type
class Query:# 定義一個查詢字段book,返回Book類型@strawberry.fielddef book(self) -> Book:# 返回一個固定的Book對象實例return Book(title="Computer Fundamentals", author="Sinha", price=300)# 導入FastAPI(用于創建Web服務)
from fastapi import FastAPI
# 導入Strawberry的ASGI適配器
from strawberry.asgi import GraphQL# 創建GraphQL Schema(模式),指定查詢入口為Query類
schema = strawberry.Schema(query=Query)# 創建GraphQL應用實例
graphql_app = GraphQL(schema)# 創建FastAPI應用實例
app = FastAPI()# 添加HTTP路由(處理GraphQL查詢)
app.add_route("/book", graphql_app)
# 添加WebSocket路由(處理GraphQL訂閱)
app.add_websocket_route("/book", graphql_app)# 主程序入口
if __name__ == "__main__":import uvicorn# 使用uvicorn運行FastAPI應用uvicorn.run(app='__main__:app',  # 指定應用對象host='127.0.0.1',    # 監聽本地地址port=8000,           # 使用8000端口reload=True          # 開發模式:代碼修改后自動重啟)

?http://127.0.0.1:8000/book

4.FastAPI - Websockets

WebSocket?是客戶端和服務器之間的持久連接,用于在兩者之間提供雙向、全雙工?通信。 通過單個 TCP/IP 套接字連接在 HTTP 上進行通信。 它可以看作是 HTTP 的升級,而不是一個協議本身。

HTTP 的局限性之一是它是一種嚴格的半雙工或單向協議。 另一方面,使用 WebSockets,我們可以發送基于消息的數據,與 UDP 類似,但具有 TCP 的可靠性。 WebSocket 使用 HTTP 作為初始傳輸機制,但在收到 HTTP 響應后保持 TCP 連接。 同一個連接對象,它可以用于客戶端和服務器之間的雙向通信。 因此,可以使用 WebSocket API 構建實時應用程序。

FastAPI 通過 FastAPI 模塊中的 WebSocket 類支持 WebSockets。 以下示例演示了 WebSocket 在 FastAPI 應用程序中的功能。

1.首先我們有一個index()?函數來渲染一個模板(socket.html)。 它綁定到"/"路由。 HTML 文件 socket.html 位于"templates"文件夾中。

main.py

from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
templates = Jinja2Templates(directory="templates")#模板目錄
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount("/static", StaticFiles(directory="./templates/static"), name="static")#靜態文件目錄
@app.get("/", response_class=HTMLResponse)
async def index(request: Request):return templates.TemplateResponse("socket.html", {"request": request})

?socket.html

<!DOCTYPE html>
<html><head><title>Chat</title><script src="{{ url_for('static', path='ws.js') }}"></script></head><body><h1>WebSocket Chat</h1><form action="" onsubmit="sendMessage(event)"><input type="text" id="messageText" autocomplete="off"/><button>Send</button></form><ul id='messages'></ul></body>
</html>

在 socket.html 中,調用了在表單提交時執行的 JavaScript 函數。 因此,為了服務 JavaScript,首先安裝"static"文件夾。 JavaScript 文件 ws.js 位于"static"文件夾中。

?ws.js

var ws = new WebSocket("ws://localhost:8000/ws");
ws.onmessage = function(event) {var messages = document.getElementById('messages')var message = document.createElement('li')var content = document.createTextNode(event.data)message.appendChild(content)messages.appendChild(message)
};
function sendMessage(event) {var input = document.getElementById("messageText")ws.send(input.value)input.value = ''event.preventDefault()
}

加載 JavaScript 代碼時,它會創建一個監聽"ws://localhost:8000/ws"的 websocket。?sendMessage()?函數將輸入消息定向到 WebSocket URL。

此路由調用應用程序代碼中的?websocket_endpoint()?函數。 傳入的連接請求被接受,傳入的消息在客戶端瀏覽器上回顯。 將以下代碼添加到 main.py。

from fastapi import WebSocket
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"Message text was: {data}")

整個路由結構:

?5.FastAPI - 事件處理程序

事件處理程序是當某個確定的事件發生時要執行的函數。 在 FastAPI 中,標識了兩個這樣的事件 ?

  1. ?startup?
  2. shutdown

FastAPI 的應用程序對象具有?on_event()?裝飾器,它使用其中一個事件作為參數。 當相應的事件發生時,使用此裝飾器注冊的函數將被觸發。

這是啟動和關閉事件處理程序的簡單示例。 當應用程序啟動時,開始時間會在控制臺日志中回顯。 同樣,當服務器按ctrl+c停止時,也會顯示關機時間。

from fastapi import FastAPI
import datetime
app = FastAPI()
@app.on_event("startup")
async def startup_event():print('Server started :', datetime.datetime.now())
@app.on_event("shutdown")
async def shutdown_event():print('server Shutdown :', datetime.datetime.now())if __name__ == '__main__':import uvicornuvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

6.FastAPI - 安裝 Flask 應用程序

用 Flask 或 Django 框架編寫的 WSGI 應用程序可以包裝在?WSGIMiddleware?中,并將其安裝在 FastAPI 應用程序上以使其符合 ASGI 標準。

from flask import Flask
import uvicorn
from fastapi.middleware.wsgi import WSGIMiddleware
from fastapi import FastAPIflask_app = Flask(__name__)
@flask_app.route("/")
def index_flask():return "Hello World from Flask!"app = FastAPI()
@app.get("/")
def index():return {"message": "Hello World from FastAPI!"}app.mount("/flask", WSGIMiddleware(flask_app))if __name__ == '__main__':uvicorn.run(app='__main__:app', host='127.0.0.1', port=8000, reload=True)

使用 mount() 方法將 flask 應用程序掛載為 FastAPI 主應用程序的子應用程序。

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

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

相關文章

FEMFAT許可的更新與升級流程

隨著工程仿真技術的不斷發展&#xff0c;FEMFAT作為一款領先的疲勞分析軟件&#xff0c;持續為用戶提供卓越的性能和創新的功能。為了保持軟件的最新性和高效性&#xff0c;了解FEMFAT許可的更新與升級流程至關重要。本文將為您詳細介紹FEMFAT許可的更新與升級流程&#xff0c;…

麒麟v10,arm64架構,編譯安裝Qt5.12.8

Window和麒麟x86_64架構&#xff0c;官網提供安裝包&#xff0c;麒麟arm64架構的&#xff0c;只能自己用編碼編譯安裝。 注意&#xff0c;“桌面”路徑是中文&#xff0c;所以不要把源碼放在桌面上編譯。 1. 下載源碼 從官網下載源碼&#xff1a;https://download.qt.io/arc…

20250528-C#知識:結構體

C#知識&#xff1a;結構體 結構體是一種自定義數據類型&#xff0c;用戶可以根據自身需求設計自己的結構體用來表示某種數據集合。結構體是一種值類型&#xff0c;結合了值類型的優點&#xff0c;避免了引用類型的缺點。本文簡單介紹并探究一下C#中的結構體。 結構體一般寫在命…

CRM系統的功能模塊劃分

基礎管理模塊 用戶管理 用戶注冊與登錄角色權限管理部門組織架構用戶信息管理 系統設置 基礎參數配置系統日志管理數據字典管理系統監控 客戶管理模塊 客戶信息管理 客戶基本信息客戶分類管理客戶標簽管理客戶關系圖譜 聯系人管理 聯系人信息聯系記錄溝通歷史重要日期提醒 …

Python中的跨域資源共享(CORS)處理

在Web開發中&#xff0c;跨域資源共享&#xff08;CORS&#xff09;是瀏覽器強制執行的安全機制&#xff0c;用于控制不同源&#xff08;協議域名端口&#xff09;之間的資源交互。下面我將通過Python示例詳細講解CORS的實現。 原生Python實現CORS Flask框架手動實現CORS fr…

Kruskal算法剖析與py/cpp/Java語言實現

Kruskal算法剖析與py/cpp/Java語言實現 一、Kruskal算法的基本概念1.1 最小生成樹1.2 Kruskal算法核心思想 二、Kruskal算法的執行流程三、Kruskal算法的代碼實現3.1 Python實現3.2 C實現3.3 Java實現 四、算法復雜度分析4.1 時間復雜度4.2 空間復雜度 五、Kruskal算法應用場景…

微信小程序返回上一頁監聽

本文實現的是微信小程序在返回上一頁時獲取通知并自定義業務。 最簡單的實現&#xff1a; 使用 wx.enableAlertBeforeUnload() 優點&#xff1a;快速接入 缺點&#xff1a;手勢不能識別、無法自定義彈窗內容&#xff08;僅詢問&#xff09; 方法二&#xff1a; page-conta…

Excel 統計某個字符串在指定區域出現的次數

【本文概要】 Excel 統計某個字符串在指定區域出現的次數&#xff1a; 1、Excel 統計一個單元格內的某字符串的出現次數 2、Excel 統計某一列所有單元格內的某字符串的出現次數 3、Excel 統計某一區域所有單元格內的某字符串的出現次數 1、Excel 統計一個單元格內的某字符串的出…

生物化學:藥品藥物 營養和補充劑信息 第三方認證信息 常見誤區 匯總

常見維生素和礦物質成分表 成分名稱好處副作用&#xff08;超量或敏感情況&#xff09;運作方式推薦日劑量&#xff08;成人&#xff09;劑量說明維生素A&#xff08;視黃醇&#xff09;視力、免疫、皮膚健康過量可致肝損傷、頭痛、脫發調節視網膜功能、細胞分化700–900 g RA…

mock庫知識筆記(持續更新)

文章目錄 mock簡介導入方式參數簡介使用場景&#xff08;待更新&#xff09;常見問題總結&#xff08;待更新&#xff09;Python代碼官網 mock簡介 mock是一個模擬對象庫&#xff0c;具有模擬其他python對象的功能&#xff0c;還能指定模擬對象的返回值和設置模擬對象的屬性。…

扇形 圓形 面積公式

? 一、圓的面積公式 全圓面積&#xff1a; A circle π r 2 A_{\text{circle}} \pi r^2 Acircle?πr2 ? 二、扇形的面積公式&#xff08;兩種制式&#xff09; 弧度制&#xff1a; A sector 1 2 r 2 θ A_{\text{sector}} \frac{1}{2} r^2 \theta Asector?21?r2θ …

怎樣將win11+ubuntu雙系統的ubuntu從機械硬盤遷移至固態硬盤(1)

將 Ubuntu 從機械硬盤遷移到固態硬盤是一個涉及多個步驟的過程。以下是一個基本的遷移指南&#xff1a; 1. 前期準備 1.1 備份數據&#xff1a; 確保你已備份數據&#xff0c;以防止在遷移過程中出現意外導致任何數據丟失。 1.2 固態硬盤安裝&#xff1a; 確保固態硬盤正確…

js中common.js和ECMAScript.js區別

以下是關于 CommonJS 和 ECMAScript Modules&#xff08;ESM&#xff09;的詳細對比分析&#xff0c;包含底層原理和示例說明&#xff1a; &#x1f9e9; 核心差異對比表 特性CommonJSES Modules來源Node.js 社區規范ECMAScript 語言標準加載方式動態加載&#xff08;運行時解…

玻纖效應的時序偏差

隨著比特率繼續飆升&#xff0c;光纖編織效應時序偏移正成為一個越來越嚴重的問題。對于 5GB/s 及以上的信號傳輸速率&#xff0c;它實際上會毀了您的一天。例如&#xff0c;左圖顯示由于 12.7 英寸的纖維編織效果&#xff0c;5GB/s 的接收眼完全閉合。使用 Agilent ADS 軟件進…

異步上傳石墨文件進度條前端展示記錄(采用Redis中String數據結構實現)

事件起因是客戶現場需要從石墨文檔中獲取文件信息&#xff0c;文件信息存在存在多個&#xff0c;進行批量上傳。為了用戶的友好型體驗&#xff0c;需要做進行條展示的方式&#xff0c;具體實現見下文… 上傳流程介紹 石墨文檔支持從鏈接&#x1f517;方式獲取文件信息&#xf…

3D建模的全景圖譜:從55個工具到元宇宙的數字革命

3D建模已從專業工程師的工具箱演變為全民創作的數字語言。從代碼驅動的精確建模到AI自動生成紋理&#xff0c;從開源協作到程序化生成城市&#xff0c;技術正重塑我們創造虛擬世界的方式。本文將系統解析55個核心3D建模工具/插件&#xff0c;涵蓋在線編輯器、開源軟件、程序化生…

jsrpc進階模式 秒殺js前端逆向問題 burp聯動進行爆破

案例演示 思路就是 這個 jsrpc遠程加載加密函數的方法就是 在js代碼中進行插入一個 遠程加載的代碼 從而實現 &#xff1a; 第一步還是使用 js_tools 進行 查找算法的位置 這個可以幫助我們找到明文>密文 加密算法函數的位置 因為這個需要我們進行js前端代碼的修改 所以…

基于BERT-Prompt的領域句子向量訓練方法

基于BERT-Prompt的領域句子向量訓練方法 一、核心原理:基于BERT-Prompt的領域句子向量訓練方法 論文提出一種結合提示學習(Prompt Learning)和BERT的領域句子向量訓練方法,旨在解決裝備保障領域文本的語義表示問題。核心原理如下: 以下通過具體例子解釋傳統詞向量方法和…

Python PyMySQL

1.PyMySQL是什么 是Python操作mysql的一個包 2.PyMySQL使用基本步驟 2.1 創建連接 conn pymysql.connect(host10.248.53.148,password123456,port3306,userroot,databasetest_database,charsetutf8)2.2 游標 2.2.1 什么是游標 游標實際上是一種能從包括多條數據記錄的結果…

OC—UI學習-1

OC—UI學習 UILabel UILabel是UIKit框架中的一個類Label主要參數 text&#xff1a;文本frame&#xff1a;位置框架backgroundcolor&#xff1a;背景顏色textAlignment&#xff1a;設置文本在Label中的位置textColor&#xff1a;文本顏色shadowColor&#xff1a;陰影顏色shado…