FastAPI 第六课 -- 请求和响应

目录

一. 前言

二. 请求数据

2.1. 查询参数

2.2. 路径参数

2.3. 请求体

三. 响应数据

3.1. 返回 JSON 数据

3.2. 返回 Pydantic 模型

3.3. 请求头和 Cookie

四. 重定向和状态码

五. 自定义响应头


一. 前言

在 FastAPI 中,请求(Request)和响应(Response)是与客户端交互的核心。

FastAPI 提供了强大的工具来解析请求数据,并根据需要生成规范的响应。

接下来我们来详细看下 FastAPI 的请求和响应。

二. 请求数据

2.1. 查询参数

以下实例中我们定义了一个 /items/ 路由,接受两个查询参数 skip 和 limit,它们的类型均为整数,默认值分别为 0 和 10

from fastapi import FastAPI

app = FastAPI()

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

在命令行中运行以下命令以启动应用:

uvicorn main:app --reload

现在,打开浏览器并访问 http://127.0.0.1:8000/items/,返回了默认的 JSON 数据:

传递 GET 请求的参数 http://127.0.0.1:8000/items/?skip=1&limit=5,返回 JSON 数据如下所示:

2.2. 路径参数

我们可以把参数设置在路径上,这样 URL 看起来更美观一些。

以下实例我们定义了一个带有路径参数 item_id 和查询参数 q 的路由。

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

传递 GET 请求的参数 http://127.0.0.1:8000/items/5/?q=labixiaoliu,返回 JSON 数据如下所示:

// 20231221151952// http://127.0.0.1:8000/items/5?g=labixiaoliu
{
    "item_id":5,
    "q":"labixiaoliu"
}

2.3. 请求体

接下来我们创建了一个 /items/ 路由,使用 @app.post 装饰器表示这是一个处理 POST 请求的路由。

from pydantic import BaseModel
from fastapi import FastAPI

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

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

使用 Pydantic 模型 Item 定义了一个请求体,包含多个字段,其中一些有默认值。

接下来我们可以打开 http://127.0.0.1:8000/docs 来进行 POST 测试:

填写请求参数:

{
    "name":"labixiaoliu",
    "description":"蜡笔小流 POST 测试"
    "price":12.0,
    "tax":1.0
}

三. 响应数据

3.1. 返回 JSON 数据

路由处理函数返回一个字典,该字典将被 FastAPI 自动转换为 JSON 格式,并作为响应发送给客户端:

from fastapi import FastAPI

app = FastAPI()

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

以上代码在浏览器访问 http://127.0.0.1:8000/items/,返回了 JSON 数据:

3.2. 返回 Pydantic 模型

路由处理函数返回一个 Pydantic 模型实例,FastAPI 将自动将其转换为 JSON 格式,并作为响应发送给客户端:

from pydantic import BaseModel
from fastapi import FastAPI

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

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

POST 请求,返回的数据格式如下所示:

{
  "name": "labixiaoliu",
  "description": "蜡笔小流 POST 测试",
  "price": 12,
  "tax": 1
}

3.3. 请求头和 Cookie

使用 Header 和 Cookie 类型注解获取请求头和 Cookie 数据。

from fastapi import Header, Cookie
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

以上代码在浏览器访问 http://127.0.0.1:8000/items/,返回了 JSON 数据:

四. 重定向和状态码

使用 RedirectResponse 实现重定向,将客户端重定向到 /items/ 路由。

from fastapi import Header, Cookie
from fastapi import FastAPI
from fastapi.responses import RedirectResponse

app = FastAPI()

@app.get("/items/")
def read_item(user_agent: str = Header(None), session_token: str = Cookie(None)):
    return {"User-Agent": user_agent, "Session-Token": session_token}

@app.get("/redirect")
def redirect():
    return RedirectResponse(url="/items/")

以上代码在浏览器访问 http://127.0.0.1:8000/redirect/ 会自动跳转到 http://127.0.0.1:8000/items/ 页面:

使用 HTTPException 抛出异常,返回自定义的状态码和详细信息。

以下实例在 item_id 为 42 会返回 404 状态码:

from fastapi import HTTPException

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id == 42:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

以上代码在浏览器访问 http://127.0.0.1:8000/items/42/ 页面显示如下:

五. 自定义响应头

使用 JSONResponse 自定义响应头:

from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/items/{item_id}")
def read_item(item_id: int):
    content = {"item_id": item_id}
    headers = {"X-Custom-Header": "custom-header-value"}
    return JSONResponse(content=content, headers=headers)

以上代码在浏览器访问 http://127.0.0.1:8000/items/42/ 页面显示如下,可以看到我们自定义的响应头:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日论文7-17MWCL基于IMOS的小vco增益变化的VCO

《Small VCO-Gain Variation Adding a Bias-Shifted Inversion-Mode MOS Varactor》17MWCL 对于PLL来说,其中VCO的调谐增益KVCO越线性,其变化程度ΔKvco越小,对PLL的稳定有较大的好处。这篇文章给了一个很简单朴素而有效的补偿var非线性的方…

nuclei配合burpsuite快速生成POC

nuclei配合burpsuite快速生成POC 简介 Nuclei是一款基于YAML语法模板的开发的定制化快速漏洞扫描器。它使用Go语言开发,具有很强的可配置性、可扩展性和易用性 官网:https://nuclei.projectdiscovery.io Nuclei项目地址:https://github.com/…

2024热门AIPPT工具大盘点

随着人工智能技术的飞速发展,一种全新的 PPT 制作方式应运而生——Ai 制作 PPT。它如同一位智能助手,为我们带来了高效、创新且个性化的 PPT 制作体验。今天我们一起探讨有哪些工具可以助力我们轻松打造出令人惊艳的演示文稿的。 1.笔灵AIPPT 链接一下…

从零开始手写STL库:Stack

从零开始手写STL库–Stack的实现 Gihub链接:miniSTL 文章目录 从零开始手写STL库–Stack的实现一、stack是什么?二、stack要包含什么函数总结 一、stack是什么? 栈是一种后进先出(LIFO,Last In First Out&#xff09…

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…

大功率蓝外光激光模组能使用多长时间?

在高科技迅猛发展的今天,大功率蓝外光激光模组作为精密光学技术的重要成果,广泛应用于科研探索、工业加工及安防监控等多个领域。其强大的光束能量与独特的波长特性,为各行各业带来了前所未有的效率提升与创新可能。然而,对于这一…

物理学基础精解【40】

文章目录 矢量积矢量积(又称叉积、外积)的几何意义一、面积表示二、垂直性三、方向性四、应用实例五、数学表达 矢量积(叉积)的坐标表示法矢量积的坐标表示法的几何意义矢量积的性质矢量积的应用 矢量积(又称叉积、外积…

【frp】frp重启、frp启动、frp后台启动、frps dashboard等等

我写的关于frp配置的文章:frp配置 服务端frps 1. 创建服务文件 sudo nano /etc/systemd/system/frps.service2. 添加服务配置 在打开的文件中添加以下内容: [Unit] DescriptionFRPS Server Afternetwork.target[Service] Typesimple ExecStart/root…

力扣高频 SQL 50 题(基础版)|分析、题解

注意一些语法 1、group by出现在having前面,但是having中所使用的聚合必须是select中的 2、date类型之间的比较:datediff() 差的绝对值 or 用字符框起来比较边界 3、算日期长度需要相减之后加一 4、round(, n)n默认是0&#x…

0基础跟德姆(dom)一起学AI 机器学习01-机器学习概述

【知道】人工智能 - Artificial Intelligence 人工智能 - AI is the field that studies the synthesis and analysis of computational agents that act intelligently - AI is to use computers to analog and instead of human brain - 释义 - 仿智; 像人…

在线翻译器工具横评:性能、准确率大比拼

无论是旅行者在异国他乡探寻风土人情,学者研究国外的前沿学术成果,还是商务人士与国际伙伴洽谈合作,都离不开一种高效、准确的语言沟通工具。而翻译器在线翻译能很好的帮我们解决这个问题。今天我们一起来探讨有那些好用的翻译工具。 1.福昕…

玄机--蚁剑流量

木马的连接密码是多少 黑客执行的第一个命令是什么 id 黑客读取了哪个文件的内容,提交文件绝对路径 /etc/passwd 黑客上传了什么文件到服务器,提交文件名 黑客上传的文件内容是什么 黑客下载了哪个文件,提交文件绝对路径 蚁剑流量特征总结 …

单调递增/递减栈

单调栈 单调栈分为单调递增栈和单调递减栈 单调递增栈:栈中元素从栈底到栈顶是递增的 单调递减栈:栈中元素从栈底到栈顶是递减的 应用:求解下一个大于x元素或者是小于x的元素的位置 给一个数组,返回一个大小相同的数组&#x…

4. 数据结构: 对象和数组

数字、布尔值和字符串是构建数据结构的原子。不过,许多类型的信息需要不止一个原子。对象允许我们对值(包括其他对象)进行分组,从而构建更复杂的结构。到目前为止,我们所构建的程序都受到限制,因为它们只能…

maven安装教程(图文结合,最简洁易懂)

前提 所有的Maven都需要Java环境,所以首先需要安装JDK,本教程默认已安装JDK1.8 未安装JDK可看JDK安装教程:JDK1.8安装教程 主要分为两个大步骤:安装、配置 一、下载和安装Maven 1、将maven解压后的文件夹复制到D盘根目录 (最好…

努比亚 Z17 NX563J Root 教程三方REC刷写工具教程

教程:1,自用成功 正常链接列表 adb devices 检查fastboot链接列表 fastboot devices 解锁设备fastboot oem nubia_unlock NUBIA_NX563J 我用的解锁设备是:fastboot flashing unlock 1.打开开发者选项。将OEM解锁的按钮打开 2.下载附件努…

苹果更新过时产品:三款 Mac 成“古董”,九款 Mac 彻底“停产”

9 月 24 日消息苹果今天更新了“过时产品”名单,新增加了三款 Mac 型号,并将另外九款 Mac 型号从“过时产品”归为“停产产品”。 新入列的 Mac 过时产品: MacBook Air(视网膜显示屏,13 英寸,2018 年&…

物联网迎来下半场,国产 IoTOS 打造企业级智能硬件云服务平台

如有需求,文末联系小编 氦氪云 IoTOS 是一套先进的企业级物联网解决方案平台,为万物互联提供可靠安全稳定的终端接入、协议适配、消息路由、数据存储和分析、应用使能等核心功能。面向物联网领域中的终端设备商、系统集成商、应用服务商、能力提供商等&a…

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】 目录 Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】 一、简单介绍 二、中介者模式(Mediator Pattern) 1、什么时候使用中介者模式 2、使用…