FastApi中的常见请求类型

FastApi中的常见请求类型

FastAPI

后端开发语言中,我钟情于node,高效的异步处理真是让我眼前一亮,同时,简单易懂的语法也让我非常倾心

但是但是,因为考虑要写一个深度学习算法的后端接口,所以不得不选用python作为后端进行开发,并不是我不喜欢Python,相反,Python作为我的第一语言,我同样非常喜欢,只不过我更喜欢用它来做数据分析

关于Python的后端框架,在Django和fastapi中,我最终选择了fastapi。相当长的一段时间里,我都是用Django在写后端,但是Django太臃肿了,重量级的框架很多地方难以学透,在现在前后端分离的大环境下,Django的模板语法优势也并不大

相反,fastapi只专注于后端接口开发,同时也提供了和node相似的异步处理程序。在学习fastapi过程中,记录了以下几种常见的接口请求方式:

一、主程序构建

在请求之前,先记录一下如何把后端服务跑起来

根目录下创建main.py文件,代码如下:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:HP
# datetime:2024/6/28 16:30from fastapi import FastAPI
import uvicorn
from apps.app01 import app01app = FastAPI()
app.include_router(app01)if __name__ == '__main__':uvicorn.run("main:app", port=8001, reload=True)

两点需要注意:

  1. 路由分发,即app.include_router(app01),路由处理函数写在于main文件同目录下的apps文件夹下,该文件夹下面有一个app01.py的路由处理文件,里面就是各种路由的处理函数,当一个项目同时存在多个子项时,可以创建多个app.py文件,实现路由分发

  2. 服务启动命令uvicorn.run("main:app", port=8001, reload=True),很多情况下,需要在终端执行这句代码以启动服务,但这么操作非常不方便,也记不住,因此,把这行代码写在main函数中,只要运行这个程序,就可以正常启动服务了,注意,reload=True表示自动重启服务,也就是代码改了之后,服务就会自动重启

二、请求类型

请求类型大概包括路径参数、查询参数、请求体参数、form表单上传和文件上传这么几种,其中文件上传是最复杂的,我先把全部的代码放进来,然后一一解释

apps/app01.py中的代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:HP
# datetime:2024/6/28 16:30
from fastapi import APIRouter, Form, File, UploadFile
from pydantic import BaseModel
from datetime import date, datetime
from typing import List
import osapp01 = APIRouter()class User(BaseModel):name: str = 'root'  # 默认值age: intbirth: datefriends: List[int]# 路径参数
@app01.get('/user/{id}')
async def get_user(id: int):print(id)return {"user_id": id}# 查询参数
@app01.get("/jobs")
async def get_jobs(kd, gj=None, xl=None):return {"kd": kd,"gj": gj,"xl": xl,}# 请求体参数
@app01.post("/data")
async def get_data(data: User):return data# form表单数据
@app01.post('/register')
async def register(username: str = Form(), password: str = Form()):print(username)print('----------')print(password)return {"username": username,}# 上传单个文件
@app01.post('/upload')
async def upload(file: bytes = File()):# 这里的file直接就是字节流,没有其他信息# 将文件存储到服务器# 获取当前时间,精确到毫秒current_time = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]  # 去掉最后的毫秒部分的最后一位,确保文件名合法filename = current_time + '.jpg'path = os.path.join('imgs', filename)with open(path, 'wb') as f:f.write(file)return {"status": 1,"message": "success","file": filename,}# 上传多个文件
@app01.post('/uploads')
async def uploads(files: List[bytes] = File()):for file in files:print(len(file))return {"file": len(files)}# 更加常用的文件上传方式,但postman中无法测试,因为数据中不支持UploadFile类型的数据
# 上传单个文件
@app01.post('/uploadFlie')
async def upload_file(file: UploadFile):current_time = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]  # 去掉最后的毫秒部分的最后一位,确保文件名合法filename = current_time + '.jpg'path = os.path.join('imgs', filename)with open(path, 'wb') as f:for line in file.file:f.write(line)return {"origin_name": file.filename,"sever_name": filename,}# 上传多个文件
@app01.post('/uploadFiles')
async def upload_files(files: List[UploadFile]):print(files)return {"file": len(files),}

1、路径参数

# 路径参数
@app01.get('/user/{id}')
async def get_user(id: int):print(id)return {"user_id": id}

请求示例:

image-20240702102934385

请求参数写在路径上,通常用于处理表格中的数据,比较好理解

2、查询参数

# 查询参数
@app01.get("/jobs")
async def get_jobs(kd, gj=None, xl=None):return {"kd": kd,"gj": gj,"xl": xl,}

postman中的请求示例:

image-20240702103154842

这也挺简单的,以查询参数的形式传递参数,通常来说,就是路由中?后面的都是查询参数,用&分割

3、请求体参数

一般用是post请求中,把参数封装在body(请求体)中

# 请求体参数
@app01.post("/data")
async def get_data(data: User):return data

这里用到了pydantic中的BaseModel模型,User模型继承于BaseModel,主要得记住写法

同样看看postman中的请求示例:

image-20240702103648063

在postman中,body参数要写在raw下,这里不是表单数据,不能写在x-www-form-urlencoded中

其实也挺简单的

4、form表单参数

这里正好与第3点请求体参数比较一下

# form表单数据
@app01.post('/register')
async def register(username: str = Form(), password: str = Form()):print(username)print('----------')print(password)return {"username": username,}

fastapi中封装好了Form表单数据的数据类型,这和postman中的x-www-form-urlencoded定义的form数据是一样的

看看postman中的请求示例:

image-20240702104116745

参数位置不一样

5、文件上传

(1)上传单个文件
# 上传单个文件
@app01.post('/upload')
async def upload(file: bytes = File()):# 这里的file直接就是字节流,没有其他信息# 将文件存储到服务器# 获取当前时间,精确到毫秒current_time = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]  # 去掉最后的毫秒部分的最后一位,确保文件名合法filename = current_time + '.jpg'path = os.path.join('imgs', filename)with open(path, 'wb') as f:f.write(file)return {"status": 1,"message": "success","file": filename,}

目标,前端上传文件,并将文件保存在服务器中与main.py同名的imgs文件夹下,文件名是当前时间(到毫秒).jpg

注意,这里的file是字节流,可以直接写到文件中,同样,也可以在postman中测试

image-20240702104508468

服务器下的imgs文件夹下多了一张图片

image-20240702104558750

(2)上传多个文件
# 上传多个文件
@app01.post('/uploads')
async def uploads(files: List[bytes] = File()):for file in files:print(len(file))return {"file": len(files)}

这里没再写文件存储的过程,与上传单个文件差不多,看看postman中的示例:

image-20240702104810492

(3)UploadFile上传单个文件

前面两种情况应该已经能满足大部分情况了,但是,fastapi封装了一种专用于文件上传的UploadFile类,代码如下:

# 更加常用的文件上传方式,但postman中无法测试,因为数据中不支持UploadFile类型的数据
# 上传单个文件
@app01.post('/uploadFlie')
async def upload_file(file: UploadFile):current_time = datetime.now().strftime('%Y%m%d%H%M%S%f')[:-3]  # 去掉最后的毫秒部分的最后一位,确保文件名合法filename = current_time + '.jpg'path = os.path.join('imgs', filename)with open(path, 'wb') as f:for line in file.file:f.write(line)return {"origin_name": file.filename,"sever_name": filename,}

因为这是fastapi封装的,postman不兼容,所以postman没法测,用fastapi自带的接口测试文档看下示例:

image-20240702105207200

同样看看服务器端的imgs目录:

image-20240702105303058

可以看到,对应的地方多了一张图片

需要注意的是,这里上传的file,就并不再是纯字节流数据了,而是fastapi封装的UploadFile对象,需要知道这个对象里有哪些内容,可以查看源码,也可以借助编译器逐个去看

(4)UploadFile上传多个文件
# 上传多个文件
@app01.post('/uploadFiles')
async def upload_files(files: List[UploadFile]):print(files)return {"file": len(files),}

理解了UploadFile上传单个文件,多个文件就不难了,看看接口测试文档中的示例:

image-20240702105629868

无非是多了个添加item的选项而已

对象里有哪些内容,可以查看源码,也可以借助编译器逐个去看

好了,学习完接口的请求类型,后面应该要学习orm了。。

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

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

相关文章

【MySQL】数据库——主从复制和读写分离

一、MySQL读写分离 1.概念: 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(insert、update、delete),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 …

【DRAM存储器三十二】LPDDR4介绍--基本架构和特性简介

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光LPDDR4数据手册》 、《JESD209-4D》 目录 LPDDR4的基本架构 LPDDR4的特性简介 LPDDR4的基本架构 JESD209-4D 2.1章节阐述了6种LPDDR4的die配置: 1、…

BeanFactoryAware 机制简介

BeanFactoryAware 是 Spring 框架中的一个接口,它允许一个 bean 在其初始化时感知到其所在的 BeanFactory。这通常用于在 bean 内部进行一些高级配置或访问 Spring 容器中的其他 bean。 简单使用 当你实现 BeanFactoryAware 接口时,你需要实现 setBeanF…

每日复盘-20240702

今日关注: 20240702 六日涨幅最大: ------1--------301388--------- 欣灵电气 五日涨幅最大: ------1--------301388--------- 欣灵电气 四日涨幅最大: ------1--------301388--------- 欣灵电气 三日涨幅最大: ------1--------301388--------- 欣灵电气 二日涨幅最…

OpenSSH RCE (CVE-2024-6387) | 附poc | 小试

Ⅰ 漏洞描述 OpenSSH 远程代码执行漏洞(CVE-2024-6387)&#xff0c;该漏洞是由于OpenSSH服务器 (sshd) 中的信号处理程序竞争问题&#xff0c;未经身份验证的攻击者可以利用此漏洞在Linux系统上以root身份执行任意代码。 Ⅱ 影响范围 8.5p1 < OpenSSH < 9.8p1 但OpenSS…

Java--创建对象内存分析

1.如图所示&#xff0c;左边为一个主程序&#xff0c;拥有main方法&#xff0c;右边定义了一个Pet类&#xff0c;通过debug不难看出&#xff0c;当启动该方法时&#xff0c;有以下该步骤 1.运行左边的实例化Pet类对象 2.跳转至右边定义Pet类的语句 3.跳回至左边获取Pet类基本属…

PyInstaller exe文件报错

文章目录 包找不到的问题去掉黑窗口 包找不到的问题 遇到的问题 : 打包好了之后exe文件报错: 没有找到这个文件 1.当时打包的 有这个文件main.spec 打开它找到hiddenimports ,填上差的包 2, 删除build和dist 3,在当前命令行下执行pyinstaller main.spec打包生成exe 去掉黑…

3.js - 深度测试、深度写入、深度函数

md&#xff0c;艹&#xff0c;这玩意得理解&#xff0c;只看代码不管事 效果图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } …

入门PHP就来我这(纯干货)05

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 数组及创建 数组&#xff0c;顾名思义&#xff0c;本质上就是一系列数据的组合…

高薪程序员必修课-volatile如何解决并发场景下可见性和有序性的问题

目录 前言 原理 可见性 有序性 示例 示例1&#xff1a;解决可见性问题 示例2&#xff1a;解决有序性问题 总结 前言 在Java中&#xff0c;volatile 关键字用于解决并发场景下的可见性和有序性问题。通过理解 volatile 的工作原理和使用示例&#xff0c;可以更好地应用它…

如何绕过验证码:终极指南 2024

你正在上网&#xff0c;突然出现了一个验证码&#xff0c;打断了你的浏览。是的&#xff0c;这就是那个确保你不是机器人的小测试&#xff0c;面对现实吧–它真的会拖慢你的进程。好消息是什么&#xff1f;你不必被卡住。你可以绕过验证码。所以&#xff0c;系好安全带&#xf…

Studying-代码随想录训练营day26| 491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独、回溯总结

第26天&#xff0c;回溯part04&#xff0c;昨天休息复习总结回溯内容&#xff0c;&#x1f4aa;(ง •_•)ง&#x1f4aa; 目录 491.递增子序列 46.全排列 47.全排列 II 51.N皇后 37.解数独 回溯总结 491.递增子序列 文档讲解&#xff1a;代码随想录递增子序列 视频讲…

[数据库原理]数据库设计(er图)

xtu期末是机试&#xff0c;所以图形表示有点不同 实体之间的关系&#xff1a; 多对多&#xff1a;可以生成一个新的关系模型一对一&#xff1a;两边都要关联一对多、多对一 &#xff1a;一的主键可以作为多的外键 如有错误&#xff0c;欢迎指正&#xff01;&#xff01;&#x…

中画幅巡检相机-SHARE 100M A10

【毫厘之间&#xff0c;洞见非凡】 ——SHARE 100M A10中画幅测量相机&#xff0c;巡检行业的新选择 在巡检行业&#xff0c;精准度是关键&#xff0c;深圳赛尔智控科技有限公司最新推出的SHARE 100M A10中画幅测量相机&#xff0c;基于先进的IMX461影像传感器&#xff0c;拥有…

Java面试题:索引创建的原则

索引创建的原则 针对数据量较大,且查询较频繁的表建立索引 (单表超过10w) 针对于常作为 查询条件(where) 排序(order by) 分组(group by) 操作的字段建立索引 尽量选择区分度高的列作为索引,尽量选择唯一索引,区分度越高,使用索引的效率越高 字符串类型字段,字段长度越…

rmvb转mp4格式有什么好方法?这四种好方法轻松帮你完成转换!

rmvb转mp4格式有什么好方法&#xff1f;当大家深入探索视频格式的多元世界时&#xff0c;不禁会被各种格式的独特魅力所吸引&#xff0c;在众多选项中&#xff0c;RMVB和MP4无疑是两大热门选择&#xff0c;它们各自在不同的场合下展现出了令人瞩目的优势与局限&#xff0c;首先…

25考研:今年初试时间比去年更早了?

过去5年考研初试时间安排如下&#xff1a; 24考研&#xff1a;2023年12月23-24日&#xff08;倒数第二个周末&#xff09; 23考研&#xff1a;2022年12月24-25日&#xff08;倒数第二个周末&#xff09; 22考研&#xff1a;2021年12月25-26日&#xff08;最后一个周末&#xf…

中英双语介绍美国的州:俄亥俄州(Ohio)

中文版 俄亥俄州简介 俄亥俄州位于美国中西部地区&#xff0c;是一个以其工业基础、文化遗产和教育资源而著称的州。以下是对俄亥俄州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市。 地理位置 俄亥俄州北接密歇根州和伊利湖&#xff0c;东临宾…

【Linux】TCP协议【下二】{流量控制/滑动窗口/延迟应答/捎带应答/拥塞控制}

文章目录 1.流量控制--利用“窗口大小”字段协商数据量大小1. 1第一次的时候&#xff0c;怎么保证发送数据量是合理的1.2第三次握手ack的时候&#xff0c;可以携带数据&#xff01;1.3流量控制&#xff0c;属于可靠性还是属于效率&#xff1f; 2.滑动窗口--利用滑动窗口解决批量…

x264 编码器分析、预测、估计模块相关结构体介绍

分析模块相关结构体 x264_mb_analysis_t 定义:在 analyse.c 文件中定义typedef struct {/* conduct the analysis using this lamda and QP */int i_lambda;int i_lambda2;int i_qp;uint16_t *p_cost_mv;uint16_t *p_cost_ref[2</