FastAPI进阶:Form参数在API设计中的最佳实践

在FastAPI中,当你想要从form-data(通常在HTML表单中使用)中获取数据时,你需要使用Form类来声明这些参数。这告诉FastAPI,这些参数应该从请求的表单数据中获取,而不是从查询参数或请求体(JSON)中获取。

以下是一个使用Form从表单数据中获取参数的示例:

from fastapi import FastAPI, Form
from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strdescription: str = Noneprice: floattax: float = None@app.post("/items/")
async def create_item(name: str = Form(...), description: str = Form(None), price: float = Form(...), tax: float = Form(None)):item = Item(name=name, description=description, price=price, tax=tax)return item

在这个例子中,我们定义了一个Item模型,它包含几个字段,其中一些字段是可选的。我们创建了一个POST路由/items/,它接受来自表单的参数。我们使用Form来声明namedescriptionpricetax参数,这样FastAPI就知道这些参数应该从表单数据中获取。

如果你想使用HTML表单发送请求到这个端点,你的HTML代码可能看起来像这样:

<form action="http://localhost:8000/items/" method="post"><input type="text" name="name" placeholder="Name"><input type="text" name="description" placeholder="Description"><input type="number" name="price" placeholder="Price"><input type="number" name="tax" placeholder="Tax"><button type="submit">Create Item</button>
</form>

当用户填写表单并提交时,表单数据将作为form-data发送到服务器,FastAPI将解析这些数据并使用Form声明的参数来填充Item模型。

请注意,如果你使用Form但客户端请求没有包含表单数据,FastAPI将返回一个错误。因此,确保客户端请求与你的端点期望的参数类型相匹配。

在FastAPI中,使用Form声明与接收POST JSON值的主要区别在于数据的来源和期望的请求内容类型。以下是详细说明:

重点使用Form声明

  1. 数据来源:当你使用Form声明参数时,你期望从form-data中获取数据。这种数据通常通过multipart/form-data编码的POST请求发送,这在提交HTML表单时非常常见。

  2. 请求内容类型:使用Form时,FastAPI期望客户端发送multipart/form-data内容类型的请求。这种类型的请求可以包含文件上传和其他表单字段。

  3. 参数声明:使用Form时,你需要在函数参数前加上Form来明确指出该参数应该从表单数据中获取。例如:

    name: str = Form(...)
    
  4. 使用场景Form参数通常用于处理文件上传、接收用户提交的表单数据等场景。

原来使用的POST JSON值

  1. 数据来源:接收POST JSON值意味着你期望从请求体中的JSON数据中获取参数。这种数据通常通过application/json编码的POST请求发送。

  2. 请求内容类型:当客户端发送JSON数据时,请求的内容类型是application/json

  3. 参数声明:对于JSON请求体,你不需要使用Form。FastAPI会自动将JSON请求体解析为Pydantic模型或直接作为参数传递给路由函数。例如:

    name: str
    
  4. 使用场景:JSON请求体通常用于API接口,其中客户端(如前端应用、移动应用或其他服务)发送结构化的JSON数据。

着重说明Form

  • 表单数据解析Form用于告诉FastAPI从form-data中解析数据。这对于处理文件上传和表单字段非常有用。

  • 非JSON数据Form允许你接收非JSON格式的数据,这在处理二进制文件(如图片、文档等)或简单的键值对数据时非常有用。

  • 字段验证:即使使用Form,FastAPI仍然可以利用Pydantic进行字段验证,确保接收到的数据符合预期的类型和格式。

  • 示例

    @app.post("/upload/")
    async def upload_file(file: UploadFile = File(...), token: str = Form(...)):# 处理文件上传和表单字段return {"filename": file.filename, "token": token}
    

在这个示例中,file参数用于接收上传的文件,而token参数则使用Form来从表单数据中获取。

Form在FastAPI中用于明确指出某些参数应该从multipart/form-data编码的表单数据中获取,这与从JSON请求体中获取参数有明显区别。使用Form时,你需要确保客户端发送的是适当编码的表单数据。

使用Form来声明表单字段是FastAPI中处理特定类型请求的一种方式,它不会影响前后端分离的设计模式,而是为这种模式提供了一种处理表单数据的选项。

使用Form时,数据通常以multipart/form-data格式发送,这适用于文件上传或提交包含文件的表单数据。而前后端分离的模式中,前端可以通过JavaScript库(如Axios、Fetch API等)来构造这种类型的请求。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

【科研小白系列】使用screen创建虚拟终端,实现本地关机后服务器仍然跑模型

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦往期回顾&#xff1a; 【科研小白系列】模型训练已经停止(强行中断)了&#xff0c;可GPU不释放显存&#xff0c;如何解决&#xff1f; 每日一言&#x1f33c;: “生…

k8s网络

pod 网络 在K8S集群里&#xff0c;多个节点上的Pod相互通信&#xff0c;要通过网络插件来完成&#xff0c;比如Calico网络插件。 使用kubeadm初始化K8S集群时&#xff0c;有指定一个参数–pod-network-cidr10.18.0.0/16 它用来定义Pod的网段。 而我们在配置Calico的时候&#…

Trm理论 2(Word2Vec)

神经网络模型&#xff08;NNLM&#xff09;和Word2Vec NNLM模型是上次说过的模型&#xff0c;其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

jmeter性能测试HTML测试报告生成详解

作用&#xff1a;jmeter支持生成HTML测试报告&#xff0c;方便查看测试计划中获得图表和统计信息 命令&#xff1a; jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] 示例&#xff1a;jmeter -n -t login.jmx -l result.jtl -e -o ./report jmx文件&a…

Gmsh:一个开源的三维有限元网格生成工具

Gmsh 是一个开源的三维有限元网格生成工具,主要用于在计算流体力学(CFD)和有限元分析(FEA)中生成复杂几何体的网格。它具有强大的几何建模、网格生成、求解器接口和后处理功能。Gmsh 适用于多种物理领域的模拟,包括流体力学、结构分析、电磁学等。 下载地址:https://gm…

【HarmonyOS】- 内存优化

文章目录 知识回顾前言源码分析1. onMemoryLevel2. 使用LRUCache优化ArkTS内存原理介绍3. 使用生命周期管理优化ArkTS内存4. 使用purgeable优化C++内存拓展知识1. Purgeable Memory总结知识回顾 前言 当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应…

Java中Date类型上的注解

在日常开发中&#xff0c;涉及到日期时间类型Date和常用的注解DateTimeFormat和JsonFormat java.util.Date; org.springframework.format.annotation.DateTimeFormat; com.fasterxml.jackson.annotation.JsonFormat; 一 Date类型字段不使用注解 Data AllArgsConstructor N…

开源还是封闭?人工智能的两难选择

这篇文章于 2024 年 7 月 29 日首次出现在 The New Stack 上。人工智能正处于软件行业的完美风暴中&#xff0c;现在马克扎克伯格 &#xff08;Mark Zuckerberg&#xff09; 正在呼吁开源 AI。 关于如何控制 AI 的三个强大观点正在发生碰撞&#xff1a; 1 . 所有 AI 都应该是开…

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页&#xff1a;https://tangyuan96.github.io/minigpt_3d_project_page/ 代码&#xff1a;https://github.com/TangYuan96/MiniGPT-3D 论文&#xff1a;https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA&#xff0c;被ACM MM2024接收&#xff0c;只拥…

【软件设计师真题】下午题第一大题---数据流图设计

解答数据流图的题目关键在于细心。 考试时一定要仔细阅读题目说明和给出的流程图。另外&#xff0c;解题时要懂得将说明和流程图进行对照&#xff0c;将父图和子图进行对照&#xff0c;切忌按照常识来猜测。同时应按照一定顺序考虑问题&#xff0c;以防遗漏&#xff0c;比如可以…

Einsum(Einstein summation convention)

Einsum&#xff08;Einstein summation convention&#xff09; 笔记来源&#xff1a; Permute和Reshape嫌麻烦&#xff1f;einsum来帮忙&#xff01; The Einstein summation convention is a notational shorthand used in tensor calculus, particularly in the fields of …

[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;17318 标注数量(xml文件个数)&#xff1a;17318 标注数量(txt文件个数)&#xff1a;17318 标…

张飞硬件11~19-电容篇笔记

电容作用 作为源&#xff0c;对后级电路提供能量&#xff0c;对源进行充电。简单讲就是放电和充电。在电路设计中&#xff0c;源往往与负载相隔很远&#xff0c;增加电容就可以起到稳定作用。电容两端的电压不能激变&#xff0c;增加电容可以稳定电压。 电容可以类比为水坝&a…

(javaweb)mysql---DDL

一.数据模型&#xff0c;数据库操作 1.二维表&#xff1a;有行有列 2. 3.客户端连接数据库&#xff0c;发送sql语句给DBMS&#xff08;数据库管理系统&#xff09;&#xff0c;DBMS创建--以文件夹显示 二.表结构操作--创建 database和schema含义一样。 这样就显示出了之前的内容…

系统编程--线程

这里写目录标题 线程概念什么是线程简介图解 内核原理图解 线程共享资源与非共享资源共享资源非共享资源 线程优缺点 线程控制原语pthread_self、pthread_create简介代码总结 循环创建多个子线程错误代码 线程间全局变量共享pthread_exit简介代码 pthread_join&#xff08;回收…

传统CV算法——基于Sift算法实现特征点检测

图像尺度空间 在一定的范围内&#xff0c;无论物体是大还是小&#xff0c;人眼都可以分辨出来。然而&#xff0c;计算机要具备相同的能力却很难。因此&#xff0c;为了让机器能够对物体在不同尺度下有一个统一的认知&#xff0c;就需要考虑图像在不同尺度下所存在的特点。这就…

Infiniband网络架构的技术与性能分析

Infiniband格局寡头&#xff0c;性能占优 这篇文章探讨了网络交换机的性能优势&#xff0c;以及如何通过扩大模型参数量来提高语言模型的生成和预测能力。然而&#xff0c;计算约束对这种正向关系产生了重要影响&#xff0c;导致在相同的计算约束下&#xff0c;总存在最佳的模型…

Linux网络编程IO管理

网络 IO 涉及到两个系统对象&#xff0c;一个是用户空间调用 IO 的进程或者线程&#xff0c;一个是内核空间的内核系统&#xff0c;比如发生 IO 操作 read 时&#xff0c;它会经历两个阶段&#xff1a; 等待内核协议栈的数据准备就绪&#xff1b;将内核中的数据拷贝到用户态的…

随机森林Random Forest(RF)回归预测-MATLAB代码实现

一、随机森林RF&#xff08;代码获取&#xff1a;底部公众号&#xff09; 随机森林&#xff08;Random Forest&#xff0c;RF&#xff09;是一种机器学习方法&#xff0c;常用于回归预测和分类任务。它通过构建多个决策树&#xff0c;并通过组合它们的预测结果来进行回归预测。…