news 2026/7/21 5:47:27

FastAPI异步API初学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI异步API初学

1.Fastapi的优势

1.异步任务 处理快 相比于同步任务

异步任务可以同时处理多个任务 而同步只能将一个任务执行完毕后再去 相比之下异步任务的速度和效率更快

2.核心用到async和await 一个都不能少

async 是定义一个协程函数

await是再协程函数中的挂起

2.Fastapi的用法

1.get

@user_router.get("/select_user") async def get_user_list(): users = await User.all() return {"code": 200, "data": users}

@user_router.get("/select_user") 括号中的是路由 可以自定义

async def 方法名字() 中间可以传值 如id:int name:str 前面为要传的变量名 后面为类型

@app.get("/hello/{name}") async def say_hello(name: str): return {"message": f"Hello {name}"}

如果是/{name}类型的 那么方法中传的数据变量名要与路径中的变量名相等

url……/hello/1/ 路由就相等这个样子 path 可以为变量加约束 如:

(name: str=Path( ..., title="Name", min_length=1, max_length=10, example="Mike" )):

··· 是必填 也可以为None 可以为空的意思 如果是必填不填就会出现下面场景

title 就是我们的提示

min_legth 最小长度为1 max_length 最大的长度 example 是示例 这样就算自动校验的方法

@user_router.get("/select_user") async def get_user_list(): users = await User.all() return {"code": 200, "data": users}

这个就是查询 User中的所有内容 前面要挂载 await 再django中是 models.User.object.all()

区别就是去掉models 和 object 在前面加上 await

如果需要条件查询我们如下:

@task_router.get("/") async def get_task_list( status: int = None, keyword: str = None, sort_by: str = None, ): query = Task.all() if status is not None: query = query.filter(status=status) if keyword: query = query.filter(Q(title__contains=keyword)) if sort_by: query = query.order_by(sort_by) task_list = await query return {"code": 200, "data": task_list}

我们将条件加入 都作为选填 =None 这样我们如果不填就是查询所有内容

我们定义query=Task.all 是查询Task中的所有内容 赋值给 query

下面判断如果我们输入了内容 就filter进行查询然后重新赋值给query

最后是sort_by 用哪个字段排序 await query 赋值给task_list 输出

2.post

实现我们添加是要写一个请求体

class TaskCreateRequest(BaseModel): user_id:int =Field( None, title="用户ID", description="用户ID", example=1 ) title : str description : str status : int priority : int due_date : str

请求体我们新建文件 schemas 然后在下面新建.py 在里面新建请求体 请求体中的字段要与模型中的字端对应 并且后面携带类型 也可以在后加约束 相当于校验

比如 第一个user_id 第一个为选填 如果是必填我们就写··· 如果不是我们就写None

title是标题 description就是提示 example就是示例 跟我们前面写的是一样的

然后是post添加 我们调用这个 TaskCreateRequest 请求体

@task_router.post("/add") async def create_task(task_data: TaskCreateRequest): task = await Task.create(**task_data.dict()) return {"code": 200,"msg":"创建成功","data": task}

我们传的参数 task_data: TaskCreateRequest

接受前端传的内容 然后走我们的请求体判断

task = await Task.create(**task_data.dict())

将 task_data.dict 转化为字典 添加到Task中 并且挂载一个 await

下面就是添加的请求体 基本都是必填的 也可以为选填

3.put

put和post一样都需要请求体 但是不一样的是 put的请求体 可以选填 而且我们可以传空值

class TaskUpdateRequest(BaseModel): user_id:int =Field( None, title="用户ID", description="用户ID", example=1 ) title : str=Field( None, title="任务标题", description="任务标题", example="任务标题" ) description : str=Field( None, title="任务详情", description="任务详情", example="任务详情" ) status : int=Field( None, title="任务状态", description="任务状态", example=0 ) priority : int=Field( None, title="任务优先级", description="任务优先级", example=1 ) due_date : str=Field( None, title="任务截止时间", description="任务截止时间", example="2023-01-01 00:00:00" )

把所有的请求体都设置为可以为None就是我们前端可以不修改这个字段

@task_router.put("/update/{id}") async def update_task(id: int, task_data: TaskUpdateRequest): task = await Task.filter(id=id).first() if not task: return {"code": 404, "message": "任务不存在"} update_dict = task_data.model_dump(exclude_unset=True) await task.update_from_dict(update_dict) await task.save() return {"code": 200, "message": "更新成功", "data": task}

我们传了一个id 是我们要修改任务的id 在任务列表中查找

查找后 我们 task_data.model_dump(exclude_unset=True)

将前端传入的数据 变为一个字典 只传不为None的值 这样就不会报错了 然后用

update_form_dict 进行修改就可以了

如果我们不写(exclude_unset=True) 则会一直显示我们传的值不够

4.delete

删除只需要我们在url中传一个id就可以了

@task_router.delete("/delete/{id}") async def delete_task(id: int): task = await Task.filter(id=id).first() if not task: return {"code": 404, "message": "任务不存在"} await task.delete() return {"code": 200, "message": "删除成功"}

在task中查找id 然后直接调用方法 delete就可以删除了 前面要加一个await挂载才可以使用

总结

今天学习了fastapi 的基本使用方法 以及models的创建 和挂载 以及什么是请求体 跟django的方法类似 async和await必须同时使用 django的方法现在改为前面加上await

多文件下的方法 如models routers schemas 每个文件下的py不一样 要严格分开

以及数据库的连接 迁移 数据查询 添加 修改 删除

pip install aerich

aerich init -t day01.config.TORTOISE_ORM
aerich init-db
严格按照要求 每个的配置不一样 如果要生成token 登陆验证 我们还需要加入jwt 生成前端页面要加上我们的跨域挂载

app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )
book_project/ ├── main.py # FastAPI应用主入口 │ ├── requirements.txt # Python依赖包 │ └── app/ # 应用核心代码 ├── __init__.py │ ├── config.py # 数据库配置文件 │ ├── models/ # 数据模型层 │ ├── __init__.py │ ├── models.py # 相关模型 │ ├── routers/ # API路由层 │ ├── __init__.py │ └── work.py # 相关API │ └── schemas/ # 数据验证层 (Pydantic) ├── __init__.py └── work.py # 请求/响应模型

文件夹结构

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 5:45:49

高考数学立体几何二面角6大解法全解析

1. 立体几何中二面角求解的核心价值在高考数学的立体几何板块中,二面角问题向来是区分考生水平的关键题型。去年全国卷压轴题就出现了需要构造辅助线求解二面角的经典案例,统计显示这类题目的平均得分率不足40%。不同于平面几何的直观性,空间…

作者头像 李华
网站建设 2026/7/21 5:44:53

校园AIGC技术应用中的伦理挑战与真实性保障方案

最近在技术圈里,一个看似与编程无关的话题意外引发了热议——"那个武器应用6分的JCC校草"。乍看之下,这像是个校园八卦,但深入分析后你会发现,这背后其实隐藏着一个值得所有开发者关注的技术现象:当AI生成内…

作者头像 李华
网站建设 2026/7/21 5:43:22

Python实战:逆向AES加密滑块验证码,ddddocr识别与自动化破解

1. 项目概述:当滑块验证码遇上AES加密最近在尝试自动化处理某个特定网站(我们暂且称之为“瑞某网站”)的数据时,遇到了一个相当典型的“拦路虎”:滑块验证码。这本身不算新鲜事,但麻烦在于,这个…

作者头像 李华
网站建设 2026/7/21 5:41:52

AI对话记录导出与管理全攻略

1. 为什么我们需要导出AI对话记录?在日常工作和学习中,我们与AI助手的互动越来越频繁。这些对话记录往往包含重要的工作思路、创意灵感或技术解决方案。想象一下,你花了两个小时与AI讨论一个复杂的技术问题,最后得到了完美的代码方…

作者头像 李华
网站建设 2026/7/21 5:41:25

三菱PLC MC协议1E3E帧通信开发与C#实现

1. 项目概述:三菱PLC MC协议通信开发全流程 在工业自动化领域,三菱PLC与上位机的通信一直是工程师们的核心技能需求。MC协议作为三菱PLC原生支持的通信规范,相比Modbus等通用协议具有更高的性能和更丰富的功能支持。这次我将分享一个完整的1E…

作者头像 李华
网站建设 2026/7/21 5:40:37

AI工具如何提升本科论文写作效率与质量

1. 项目概述:AI如何重塑本科论文写作流程去年指导本科生论文时,有个场景让我印象深刻:学生小张在文献综述环节卡了整整两周,反复修改的文档里堆砌着几十篇半懂不懂的文献引用。直到我推荐他试用了几款AI文献工具,三天后…

作者头像 李华