Python Web 开发:FastAPI 基本概念与应用

news2024/12/27 3:41:34

Python Web 开发:FastAPI 基本概念与应用

目录

  • 1. FastAPI 路由(定义请求路径)
  • 🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)
  • 🔑 3. 参数类型(路径参数、查询参数、请求体)
    • 🌍 查询参数(query
    • 🛣️ 路径参数(path
    • 📝 请求体(body

✨ 1. FastAPI 路由(定义请求路径)

在 FastAPI 中,路由是定义在应用实例上的一组函数,用于响应 HTTP 请求。路由的核心是通过 URL 路径和 HTTP 请求方法来匹配请求,这些请求会由相应的函数处理。每个路由装饰器(如 @app.get()@app.post())都代表一个特定的请求路径和 HTTP 方法。

路由基本定义

FastAPI 提供了简单而强大的路由机制。定义一个基本的路由时,只需在 FastAPI 实例上使用装饰器来指定 HTTP 方法和路径。以下是一个最简单的示例:

# app/main.py
from fastapi import FastAPI

# 创建 FastAPI 应用实例
app = FastAPI()

# 定义一个 GET 路由
@app.get("/")
def read_root():
    return {"message": "Welcome to FastAPI!"}

在上述代码中,我们通过 @app.get("/") 定义了一个根路径的 GET 请求,当访问 http://127.0.0.1:8000/ 时,会返回 JSON 响应 {"message": "Welcome to FastAPI!"}

动态路由与路径参数

FastAPI 路由也支持动态路径参数,这使得可以通过 URL 路径传递信息。这些参数可以用于获取数据库中的特定资源,或者进行其他计算。

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

在这个例子中,{item_id} 表示一个路径参数。当访问 http://127.0.0.1:8000/items/42 时,FastAPI 会将路径中的 42 传递给 item_id 变量。

多路径和多方法支持

一个 FastAPI 路由不仅支持单一的路径和方法,实际上,可以为同一路径配置多种 HTTP 方法,比如 GETPOST 方法,用于处理不同类型的请求。以下是如何为同一路径添加多个路由:

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"message": f"Fetching item {item_id}"}

@app.post("/items/{item_id}")
def create_item(item_id: int):
    return {"message": f"Creating item {item_id}"}

在这个示例中,同一个路径 /items/{item_id} 通过 GETPOST 方法分别提供不同的服务。GET 方法用于获取项目,而 POST 方法用于创建项目。

路由分组与组织

对于复杂应用,随着功能增加,路由管理也会变得更加复杂。FastAPI 提供了路由分组的功能,可以通过 APIRouter 来组织路由,将相关功能的路由分配到不同的模块中。例如,可以创建一个用于管理用户的路由模块,另一个用于处理商品数据的路由模块。

from fastapi import APIRouter

router = APIRouter()

@router.get("/users/{user_id}")
def read_user(user_id: int):
    return {"user_id": user_id}

# 将子路由注册到主应用
app.include_router(router)

通过这种方式,开发者可以保持路由结构的清晰和可维护性,避免单一文件中路由过多导致的代码混乱。


🚀 2. HTTP 请求方法(GET、POST、PUT、DELETE)

在 Web 开发中,不同的 HTTP 请求方法有不同的用途,它们是 HTTP 协议的一部分,用来指示客户端请求的意图。在 FastAPI 中,可以通过不同的路由装饰器来定义不同的 HTTP 方法。

GET 请求

GET 请求是最常见的 HTTP 方法,用于请求资源。它通常用于获取数据或展示信息,而不会对服务器上的数据进行任何修改。FastAPI 使用 @app.get() 来处理 GET 请求。

@app.get("/items/{item_id}")
def get_item(item_id: int):
    return {"item_id": item_id, "name": "Example Item"}

GET 请求通常是无副作用的,也就是说,它不会修改服务器上的任何数据。它只是请求某些数据。

POST 请求

GET 请求不同,POST 请求通常用于提交数据,以便服务器进行处理。这类请求会改变服务器的状态,通常用于创建新的资源。FastAPI 使用 @app.post() 来处理 POST 请求。

@app.post("/items/")
def create_item(item: dict):
    return {"message": "Item created", "item": item}

在这个例子中,POST 请求用于接收一个 JSON 数据,并返回创建的项的信息。POST 请求通常用于向服务器提交表单数据,或创建新的资源。

PUT 请求

PUT 请求用于更新现有的资源。与 POST 请求不同,PUT 请求通常是幂等的,意味着多次执行同样的 PUT 请求不会导致不同的结果。FastAPI 使用 @app.put() 来处理 PUT 请求。

@app.put("/items/{item_id}")
def update_item(item_id: int, item: dict):
    return {"message": f"Item {item_id} updated", "item": item}

PUT 请求接收的数据通常是完整的资源数据,它会替换服务器上指定资源的当前状态。

DELETE 请求

DELETE 请求用于删除服务器上的资源。当客户端发送一个 DELETE 请求时,通常是请求服务器删除某个指定的资源。FastAPI 使用 @app.delete() 来处理 DELETE 请求。

@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    return {"message": f"Item {item_id} deleted"}

DELETE 请求通常用于从数据库中删除指定的数据,或者清理服务器上的某些资源。

小结

通过 GETPOSTPUTDELETE 等 HTTP 请求方法,FastAPI 为开发者提供了处理不同类型请求的灵活性。在实际开发中,了解并正确使用这些请求方法对于设计良好的 API 至关重要。通过合理的 HTTP 方法使用,可以确保 API 的语义清晰且符合 RESTful 风格。


🔑 3. 参数类型(路径参数、查询参数、请求体)

FastAPI 提供了强大的参数类型支持,能够非常简便地处理 URL 路径、查询参数以及请求体的参数。这些参数可以帮助开发者在处理请求时灵活获取数据。

🌍 查询参数(query

查询参数通常出现在 URL 的 ? 后面,并且以 key=value 的形式传递给服务器。在 FastAPI 中,查询参数会自动被映射为函数的参数,可以使用默认值来定义可选的查询参数。

@app.get("/items/")
def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

在这个例子中,skiplimit 是查询参数,它们的默认值分别是 010。当请求 URL 为 http://127.0.0.1:8000/items/?skip=5&limit=15 时,FastAPI 会将 skip 设置为 5limit 设置为 15

查询参数通常用于分页、筛选和排序等场景。通过为查询参数提供默认值,FastAPI 可以轻松实现这些常见的功能。

🛣️ 路径参数(path

路径参数是在 URL 路径中传递的变量,它们用于标识请求的特定资源。路径参数通常出现在 URL 中的 {} 中,在 FastAPI 中,我们可以通过定义路径参数来动态地处理不同的资源。

@app.get("/items/{item_id}")
def read_item(item_id: int):
    return {"item_id": item_id}

在这个例子中,item_id 是路径参数,FastAPI 会自动从 URL 中提取路径参数的值,并将其传递给处理函数。在访问 http://127.0.0.1:8000/items/42 时,item_id 会被自动解析为 42

路径参数通常用于资源标识符,它们是 URL 的一部分,必须匹配请求的路径。

📝 请求体(body

请求体通常用于发送更复杂的数据,特别是 POSTPUTPATCH 请求。

请求体可以是 JSON 格式的对象、表单数据或文件。FastAPI 支持通过 Pydantic 模型来验证和解析请求体。

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    price: float

@app.post("/items/")
def create_item(item: Item):
    return {"item": item}

在这个例子中,Item 是一个 Pydantic 模型,它自动验证请求体的数据结构是否符合要求。FastAPI 会自动将请求体的 JSON 数据转换为 Item 实例,并传递给处理函数。

请求体通常用于提交复杂的数据,比如创建或更新资源时所需的信息。

小结

FastAPI 提供了非常灵活的参数处理机制,通过路径参数、查询参数和请求体,开发者可以轻松地从不同的 HTTP 请求中提取数据,并根据需要进行处理。通过自动验证和类型注解,FastAPI 确保了数据的完整性和正确性,减少了开发者的负担。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM:即时编译器,C2 Compiler,堆外内存排查

1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…

5G学习笔记之随机接入

目录 1. 概述 2. MSG1 2.1 选择SSB 2.2 选择Preamble Index 2.3 选择发送Preamble的时频资源 2.4 确定RA-RNTI 2.5 确定发送功率 3. MSG2 4. MSG3 5. MSG4 6. 其它 6.1 切换中的随机接入 6.2 SI请求的随机接入 6.3 通过PDCCH order重新建立同步 1. 概述 随机接入…

B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)

文章目录 0.写在前面(对mybatis,spring的理解)(不看可跳过)0.1 为什么需要mybatis0.2 为什么需要spring0.3为什么需要springmvc 1.新建ssmbuild数据库2.新建Maven项目3.初始化步骤3.1 配置下载maven依赖,构建资源导出3.2 连接数据库3.3建包&a…

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…

SQL调优分析200倍性能提升

原始SQL: selectdistinct cert.emp_id fromcm_log cl inner join(selectemp.id as emp_id,emp_cert.id as cert_id fromemployee emp left joinemp_certificate emp_cert on emp.id emp_cert.emp_id whereemp.is_deleted0) cert on (cl.ref_tableEmployee and c…

逆向攻防世界CTF系列42-reverse_re3

逆向攻防世界CTF系列42-reverse_re3 参考:CTF-reverse-reverse_re3(全网最详细wp,超4000字有效解析)_ctfreverse题目-CSDN博客 64位无壳 _int64 __fastcall main(__int64 a1, char **a2, char **a3) {int v4; // [rsp4h] [rbp-…

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组:java.lang.Class类第二组:java.la…

【热门主题】000075 探索嵌入式硬件设计的奥秘

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步,无以至千里;不积小流…

mysql系列2—InnoDB数据存储方式

背景 本文将深入探讨InnoDB的底层存储机制,包括行格式、页结构、页目录以及表空间等核心概念。通过全面了解这些基础概念,有助于把握MySQL的存储架构,也为后续深入讨论MySQL的索引原理和查询优化策略奠定了基础。 1.行格式 mysql中数据以行…

vue实现echarts饼图自动轮播

echarts官网:Examples - Apache ECharts echartsFn.ts 把echarts函数封装成一个文件 import * as echarts from "echarts";const seriesData [{"value": 12,"name": "过流报警"},{"value": 102,"name&qu…

【Python数据分析五十个小案例】使用自然语言处理(NLP)技术分析 Twitter 情感

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 项目简介 什么是情感分析 情感分析(Sentiment Analysis)是文本分析的一部分,旨在识别文本中传递的情感信息&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 (一)网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代,网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日,北交所上市审核委员会将召开2024年第24次上市委审议会议,届时将审议武汉宏海科技股份有限公司(以下简称,宏海科技)的首发上会事项。 在上会之前,宏海科技共收到北交所下…

算法日记 36-38day 动态规划

今天把动态规划结束掉,包括子序列以及编辑距离 题目:最长公共子序列 1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &…

Gopeed 1.6.3 | 不限速下载工具附百度网盘不限速教程

Gopeed是一款高效且易于使用的下载软件。它具有加速下载速度的功能,可以帮助用户更快地下载文件。此外,Gopeed还支持多线程下载,可以同时下载多个文件,提高下载效率。它提供了简洁的界面和简单的操作,方便用户操作和管…

K8S版本和istio版本的对照关系

版本对照关系 下载地址1 下载地址2

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念: RDD: 弹性分布式数据集; DataFrame: DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

如何调用百度文心一言API实现智能问答

诸神缄默不语-个人CSDN博文目录 百度需要先认证个人信息才能使用LLM API。 文章目录 1. 获得 API Key2. 撰写代码并实现提问和回答2.1 用openai包实现调用2.2 用openai包实现流式调用2.3 用openai包实现工具调用2.4 构建智能体2.5 文生图2.6 图生图 3. 用gradio建立大模型问答…

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式,各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据,使用xlwt库创建和编辑excel表,在办公自动化方面可以方便我们快速处理数据,帮助我们提升效率。 python之open…