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; 输…