使用VSCode開發FastAPI指南

1概述

FastAPI 是一個現代的高性能 Web 框架,用于使用 Python 構建 API。它旨在讓開發者輕松快速高效地構建 API,同時提供 API 的自動驗證、序列化和文檔記錄等功能,使其成為構建 Web 服務和微服務的熱門選擇。
在這個 FastAPI 教程中,我們將使用 FastAPI 創建一個雜貨清單應用程序。在本教程結束時,你將了解如何在 Visual Studio Code 終端、編輯器和調試器中使用 FastAPI。

2設置項目

要在 VS Code 中成功完成本教程,首先需要設置 Python 開發環境。具體而言,本教程需要Python 3 和VS Code 的 Python 擴展。
在本部分中,我們將創建一個文件夾以在 VS Code 中作為工作區打開,設置 Python 虛擬環境,并安裝項目的依賴項。
(1)在文件系統中,為本教程創建一個項目文件夾,例如 .groceries-plugin
(2)在 VS Code 中打開這個新文件夾(文件>打開文件夾…)。
(3)當 Workspace Trust 提示出現時,選擇 Yes, I trust the authors 以允許工作區訪問必要的資源和擴展。

現在,我們創建一個文件requirements.txt列出需為應用程序安裝的依賴項。該requirements.txt文件是 Python 開發中的一種常見做法,用于指定項目所依賴的庫及其版本。此文件有助于確保處理項目的任何人都可以重新創建類似的開發環境,使其成為保持一致性的便捷組件。
我們將安裝 FastAPI 來創建應用程序,uvicorn 作為服務器,Redis 和type-redis用于處理數據存儲和與 Redis 數據庫交互。
(1)在 VS Code 中創建新文件(文件>新建文本文件或 Ctrl+N)。
(2)向其添加以下內容:
fastapi
redis
types-redis
uvicorn
(3)保存文件 (Ctrl+S) 并將其命名為requirements.txt 。
(4)通過打開命令面板 (Ctrl+Shift+P) 并運行 Python: Create Environment 命令來創建虛擬環境。
(5)當系統詢問環境類型時,選擇 Venv:
在這里插入圖片描述

(6)然后選擇計算機上可用的最新版本的 Python:
在這里插入圖片描述

(7)從下拉列表中選擇文件requirements.txt,以便自動安裝依賴項,然后選擇 “OK”:
在這里插入圖片描述

以上操作將創建虛擬環境,自動安裝依賴項,并為工作區選擇供 Python 擴展使用的環境。你可以通過檢查 VS Code 的右下角來確認它已被選中:
在這里插入圖片描述

3開始編碼

我們開始創建應用程序。
(1)使用 File > New File… 創建新的 Python 文件,然后選擇 Python File。
(2)在文件夾groceries-plugin中另存為main.py (Ctrl+Shift+S)。
(3)將以下代碼添加到main.py并保存該文件:

from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():return {"message": "Hello World"}

(4)通過啟動調試器 (F5) 運行代碼。
(5)從下拉菜單中,從列表中選擇 FastAPI 配置選項:
在這里插入圖片描述

這會自動創建一個調試配置,該配置調用 uvicorn 以通過調試器啟動應用程序服務器,并允許你單步調試源代碼以檢查其行為。你應該在終端中看到類似以下內容的內容:
在這里插入圖片描述

提示: 如果默認端口已在使用中,請停止調試器并打開命令面板 (Ctrl+Shift+P),搜索 Debug: Add Configuration,選擇 Python Debugger,然后選擇 FastAPI。這將創建一個自定義配置文件.vscode/launch.json,你可以在其中進行編輯。將以下內容添加到"args":[]以設置自定義端口:“–port=5000”。保存文件,然后使用 (F5) 重新啟動調試器。
(6)Ctrl + 單擊終端中的http://127.0.0.1:8000/ URL在默認瀏覽器打開該地址:
在這里插入圖片描述

FastAPI 應用程序已啟動并運行!
(7)使用調試工具欄中的 Stop 按鈕或通過 Shift+F5 停止調試器。

4為雜貨清單項目創建模型

現在我們已經讓 FastAPI 應用程序運行起來,我們可以使用 Pydantic 定義雜貨清單項目,Pydantic 是一個與 FastAPI 無縫集成的數據驗證和解析庫。Pydantic 允許你使用帶有類型提示(type hints)的 Python 類定義數據模型,以便在 API 請求中自動驗證和解析傳入數據(稱為“有效負載”)。
讓我們為雜貨清單項創建一個模型ItemPayload。我們將使用該模型來定義要添加到雜貨清單中的商品的數據結構。此模型將具有三個字段:item_id 、 item_name和 quantity。
(1)使用 File > New File… 創建新的 Python 文件,然后選擇 Python File。
(2)將以下行添加到models.py文件中,然后將其保存在文件夾groceries-plugin中 (Ctrl+Shift+S):

from typing import Optional
from pydantic import BaseModel
class ItemPayload(BaseModel):item_id: Optional[int]item_name: strquantity: int

Pylance 是 VS Code 中 Python 的默認語言服務器,它支持類型提示功能,這些功能對使用 Pydantic 模型和 FastAPI 非常有用。這是因為 Pylance 構建在 Pyright 之上,Pyright 是一個 Python 的靜態類型檢查器,可以檢測代碼中的類型錯誤,以防止錯誤并提高代碼質量。

5創建路由

現在我們需要一個地方來存儲雜貨清單項目。為簡單起見,我們從一個空字典開始。
(1)首先,導入示例所需的所有包。打開文件main.py并將第一行導入行替換為以下行:

from fastapi import FastAPI, HTTPException
from models import ItemPayload

(2)在app = FastAPI()下面添加以下行:

grocery_list: dict[int, ItemPayload] = {}

這將創建一個新的空字典,該字典接收int類型(作為項目 ID) 的鍵和ItemPayload類型的值。
現在,我們將在 FastAPI 應用程序中定義路由。在 Web 應用程序的場景中,路由類似于將特定 URL 映射到處理這些 URL 的代碼的路徑。這些路由用作應用程序中不同功能的入口點。當客戶端(例如 Web 瀏覽器或其他程序)使用特定 URL 向我們的應用程序發送請求時,FastAPI 會根據 URL 將該請求路由到相應的函數(也稱為路由處理程序或視圖函數),該函數處理請求并生成響應。
讓我們繼續定義路由以添加和檢索單個項目,以及返回雜貨清單中的所有項目。

(3)在文件main.py末尾添加以下路由:

# Route to add a item
@app.post("/items/{item_name}/{quantity}")
def add_item(item_name: str, quantity: int):if quantity <= 0:raise HTTPException(status_code=400, detail="Quantity must be greater than 0.")# if item already exists, we'll just add the quantity.# get all item namesitems_ids = {item.item_name: item.item_id if item.item_id is not None else 0 for item in grocery_list.values()}if item_name in items_ids.keys():# get index of item_name in item_ids, which is the item_iditem_id = items_ids[item_name]grocery_list[item_id].quantity += quantity
# otherwise, create a new itemelse:# generate an ID for the item based on the highest ID in the grocery_listitem_id = max(grocery_list.keys()) + 1 if grocery_list else 0grocery_list[item_id] = ItemPayload(item_id=item_id, item_name=item_name, quantity=quantity)return {"item": grocery_list[item_id]}

現在,我們來檢查一下此路由是否按預期工作。最快的方法是使用 VS Code 的調試器以及 FastAPI 的端點/docs,它提供有關所有可用 API 路由的信息,并允許你與 API 交互以探索其參數和響應。本文檔是根據 FastAPI 應用程序中定義的元數據和類型提示動態生成的。

(4)通過單擊行號(或 F9)的左旁注,在if quantity <= 0語句旁邊添加一個斷點。調試器將在執行該行之前停止,因此你可以逐行檢查代碼。
在這里插入圖片描述

(5)啟動調試器 (F5),然后在瀏覽器中導航到http://127.0.0.1:8000/docs
這里應該有一個 Swagger 接口,其中包含應用程序中可用的兩個端點:/items和 root (/)。
在這里插入圖片描述

(6)選擇/items路由旁邊的向下箭頭將其展開,然后選擇右側顯示的 Try it out (試用) 按鈕。
在這里插入圖片描述

(7)通過將字符串傳遞給item_name字段并將數字傳遞給quantity 來添加雜貨清單項。例如,你可以將 apple 作為item_name ,將 2 作為 quantity.
(8)選擇 Execute。
在這里插入圖片描述

(9)再次打開 VS Code,并注意到調試器已停止在你之前設置的斷點處。
在這里插入圖片描述

在左側,此時定義的所有局部和全局變量都顯示在 Variables 窗口中的 Run and Debug 視圖下。在我們的示例中,在 locals 變量視圖下item_name設置為 ‘apple’ 并設置quantity為 2,在 globals 變量視圖下設置grocery_list為空字典。
在這里插入圖片描述

現在,讓我們使用 VS Code 的 Debug Console 進行一些探索。
(10)選擇quantity <= 0語句,右鍵單擊編輯器,然后選擇 Evaluate in Debug Console:
在這里插入圖片描述

這將打開 Debug Console 并運行選定的表達式。正如我們的示例中所預期的那樣,表達式的計算結果為False 。
Debug Console 可以是一個強大的工具,用于快速測試表達式并更好地了解斷點時代碼的狀態。你還可以使用它來運行任意代碼,例如調用函數或打印變量。你可以在 Python 教程中了解有關 VS Code 中 Python 調試的更多信息。
現在,你可以通過在 Debug view (調試) 視圖工具欄中選擇 Continue (繼續) 或按 F5 來繼續執行代碼。
最后,讓我們為應用程序添加剩余的路由,以便我們可以列出所有項目或特定項目,以及將它們從我們的雜貨清單中刪除。你可以讓調試器保持運行狀態,因為當你保存下一步中所做的更改時,它將自動重新加載應用程序。

(11)將main.py 中的內容替換為以下代碼:

from fastapi import FastAPI, HTTPException
from models import ItemPayloadapp = FastAPI()grocery_list: dict[int, ItemPayload] = {}# Route to add an item
@app.post("/items/{item_name}/{quantity}")
def add_item(item_name: str, quantity: int) -> dict[str, ItemPayload]:if quantity <= 0:raise HTTPException(status_code=400, detail="Quantity must be greater than 0.")# if item already exists, we'll just add the quantity.# get all item namesitems_ids: dict[str, int] = {item.item_name: item.item_id if item.item_id is not None else 0for item in grocery_list.values()}if item_name in items_ids.keys():# get index of item_name in item_ids, which is the item_iditem_id: int = items_ids[item_name]grocery_list[item_id].quantity += quantity# otherwise, create a new itemelse:# generate an ID for the item based on the highest ID in the grocery_listitem_id: int = max(grocery_list.keys()) + 1 if grocery_list else 0grocery_list[item_id] = ItemPayload(item_id=item_id, item_name=item_name, quantity=quantity)return {"item": grocery_list[item_id]}# Route to list a specific item by ID
@app.get("/items/{item_id}")
def list_item(item_id: int) -> dict[str, ItemPayload]:if item_id not in grocery_list:raise HTTPException(status_code=404, detail="Item not found.")return {"item": grocery_list[item_id]}# Route to list all items
@app.get("/items")
def list_items() -> dict[str, dict[int, ItemPayload]]:return {"items": grocery_list}# Route to delete a specific item by ID
@app.delete("/items/{item_id}")
def delete_item(item_id: int) -> dict[str, str]:if item_id not in grocery_list:raise HTTPException(status_code=404, detail="Item not found.")del grocery_list[item_id]return {"result": "Item deleted."}# Route to remove some quantity of a specific item by ID
@app.delete("/items/{item_id}/{quantity}")
def remove_quantity(item_id: int, quantity: int) -> dict[str, str]:if item_id not in grocery_list:raise HTTPException(status_code=404, detail="Item not found.")# if quantity to be removed is higher or equal to item's quantity, delete the itemif grocery_list[item_id].quantity <= quantity:del grocery_list[item_id]return {"result": "Item deleted."}else:grocery_list[item_id].quantity -= quantityreturn {"result": f"{quantity} items removed."}

(12)保存文件 (Ctrl+S)。應用程序應自動重新加載。

現在,你可以使用調試器和 Debug Console 再次打開/docs頁面并測試新路由,以更好地了解代碼執行情況。完成后,你可以停止調試器 (Shift+F5)。你還可以通過單擊來刪除我們在步驟 4 中添加的斷點。
現在有了一個正在運行的 FastAPI 應用程序,其中包含用于從雜貨清單中添加、列出和刪除商品的路由。

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

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

相關文章

2025年硬件實習/秋招面試準備

前言 暑期即將到來&#xff0c;有很多研一研二以及大三大四的同學準備硬件類&#xff08;硬件研發、嵌入式硬件、layout、電源設計、射頻、硬件測試、工藝、FAE&#xff09;的實習或秋招。鑒于此&#xff0c;總結一下網友們秋招、實習中的硬件高頻考點&#xff0c;并分析他們是…

VSCode - Trae 插件關閉彈出框代碼補全

Trae 插件關閉彈出框代碼補全 彈出框代碼補全與非彈出框代碼補全 如下是彈出框代碼補全 如下是非彈出框代碼補全 關閉 / 啟用彈出框代碼補全 點擊 【管理】&#xff08;小齒輪&#xff09; -> 點擊 【設置】 取消勾選&#xff08;如果需要啟用&#xff0c;則勾選即可&…

Elasticsearch從安裝到實戰、kibana安裝以及自定義IK分詞器/集成整合SpringBoot詳細的教程ES(三)

DSL官方地址&#xff1a; DSL查詢分類 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;來定義查詢。常見的查詢類型包括&#xff1a; 查詢所有&#xff1a;查詢出所有數據&#xff0…

我們來學mysql -- keepalive主從高可用

keepalive主從高可用 簡明扼要安裝KP場景“高可用”配置主keepalived.conf從keepalived.confmysql_check.sh 高可用驗證KP運行情況通過vip連接mysqlvip連接上創建數據庫關閉主庫所在服務器的KPvip連接上再次創建數據庫 結尾 簡明扼要 搭建mysql的主從八股文如是&#xff1a;主…

Compose筆記(二十六)--DatePicker

這一節主要了解一下Compose中的DatePicker,DatePicker是一個用于選擇日期的組件&#xff0c;它提供了直觀的界面讓用戶可以通過日歷視圖或直接輸入來選擇年、月、日。我們在開發中時常會用到日期選擇器&#xff0c;簡單總結如下: API: DatePickerDialog onDismissRequest&…

【靶場】upload-labs-文件上傳漏洞闖關

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言1.第一關1.保存html頁面2.修改頁面html3.訪問修改后的本地html文件4.上傳php文件5.訪問上傳的php2.第二關1.抓上傳包修改文件類型2.上傳成功3.第三關1.phtml php3會被解析為php原理2.上傳成功4…

基于 Transformer RoBERTa的情感分類任務實踐總結之四——PGM、EMA

整合了以下五大核心技術&#xff1a;R-Drop、PGM 對抗訓練、EMA、標簽平滑、CosineAnnealing 學習率調度。 1. R-Drop&#xff08;Regularized Dropout&#xff09; 原理&#xff1a;同一個樣本做兩次前向傳播&#xff08;同 dropout mask&#xff09;&#xff0c;計算兩次輸…

錄制mp4 rospy

ros 預覽攝像頭 #!/usr/bin/env python import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge import cv2# 初始化 bridge bridge CvBridge()def image_callback(msg):# 將ROS圖像消息轉換為OpenCV圖像cv_image bridge.imgmsg_to_cv2(msg, desir…

超簡單部署離線語音合成TTS和語音識別

一篇文章講清楚超簡單 離線語音合成TTS 和 離線語音識別 系統部署 本文只介紹兩個輕量級的 語音合成用piper, 語音識別用vosk 部署簡單,效果勉強 語音合成 推薦 piper (其他沒用過) 安裝 linux下安裝 pip install piper-tts下載模型(63M) 中文模型下載 zh_CN-huayan-medi…

【算力網】

一、算力網-DNS 1.1、核心架構設計 1.1.1 設計框架 基于SRv6的智能DNS算法設計框架&#xff0c;結合IPv6路由可編程性、動態路徑優化及業務感知能力&#xff0c;實現網絡性能與用戶體驗的雙重提升&#xff1a;? ?SRv6-DNS融合架構? ?控制平面?&#xff1a; DNS服務器集…

shell分析nginx日志的指令

shell指令 查看有多少個IP訪問&#xff1a; awk {print $1} log_file|sort|uniq|wc -l 查看某一個頁面被訪問的次數&#xff1a; grep "/index.php" log_file | wc -l 查看每一個IP訪問了多少個頁面&#xff1a; awk {S[$1]} END {for (a in S) print a,S[a]} …

CMS軟件以及常見分類

CMS&#xff08;Content Management System&#xff0c;內容管理系統&#xff09;是 讓非技術人員也能便捷創建、編輯、管理網站內容的軟件 &#xff0c;核心是 分離 “內容” 和 “頁面設計”&#xff08;內容存在數據庫&#xff0c;頁面用模板生成&#xff09;&#xff0c;無…

Spring @Value 典型用法

典型用法 注入常量值 Value("Hello World") private String message;注入配置文件中的屬性值&#xff08;如 application.properties&#xff09; // 假設你有如下配置&#xff1a; app.nameMyApp app.version1.0.0// Java 類中使用&#xff1a; Value("${ap…

golang -- map實現原理

目錄 一、前言二、結構1. hmap(map) 結構2. bmap(buckets) 結構 三、哈希沖突四、負載因子五、哈希函數六、擴容增量擴容等量擴容 一、前言 在現代編程語言中&#xff0c;map 是一種非常重要的數據結構&#xff0c;廣泛用于存儲和快速查找鍵值對。Go 語言中的 map 是一種高效且…

Vue2 Extends 繼承機制與組件復用實踐

extends在某些場景下依然發揮作用&#xff0c;如Options API。子組件將繼承父組件的屬性、方法、生命周期鉤子函數以及混合&#xff08;mixins&#xff09;等選項。 注意&#xff1a;子組件可以覆蓋、或繼承擴展父組件的選項。子組件的生命周期鉤子和父組件的鉤子一起執行。 &l…

openSUSE MicroOS不可變Linux

openSUSE MicroOS不可Linux 1、openSUSE MicroOS簡介安裝時可能遇到的問題 2、ssh登錄3、openSUSE MicroOS配置國內軟件源4、系統變更openSUSE MicroOS安裝軟件包方法1&#xff1a;進入事務性更新模式安裝軟件包方法2&#xff1a;繼續快照id基于這個快照進行增量安裝方法3&…

建站SEO優化之站點地圖sitemap

文章目錄 編寫規范小型網站站點地圖小型網站規范示例站點地圖說明 大型網站站點地圖大型網站規范示例以豆瓣站點地圖為例 近期文章&#xff1a; 個人建站做SEO網站外鏈這一點需要注意&#xff0c;做錯了可能受到Google懲罰一文搞懂SEO優化之站點robots.txt網頁常見水印實現方式…

Java分層開發必知:PO、BO、DTO、VO、POJO概念詳解

目錄 引言一、核心概念與定義1、PO&#xff08;Persistent Object&#xff0c;持久化對象&#xff09;2、BO&#xff08;Business Object&#xff0c;業務對象&#xff09;3、DTO&#xff08;Data Transfer Object&#xff0c;數據傳輸對象&#xff09;4、VO&#xff08;View O…

Linux下OLLAMA安裝卡住怎么辦?

網絡環境不理想&#xff0c;經常在官方的linux安裝腳本執行時卡住&#xff0c;其實主要是下載文件卡住&#xff0c;于是我想到了是否可以把其中下載的過程顯化、分步&#xff0c;這樣更可控&#xff0c;于是修改了官方的install.sh #!/bin/sh # This script installs Ollama o…

C++面試(5)-----刪除鏈表中指定值的節點

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 給定一個單向鏈表的頭節點 head 和一個特定值 val&#xff0c;要求編寫一個函數來刪除鏈表中所有值等于 val 的節點&#xff0c;并返回修改后的鏈表頭節點。 示例&#xff1a; 輸…