news 2026/4/3 4:18:50

FastAPI基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
FastAPI基础

前言

同步和异步

同步(可能需要花费10s+):

@app.get("/sync") def func_sync(): start = time.time() for i in range(10): time.sleep(1) end = time.time() return {"time":f'{end-start:.2f}s'}

异步(1秒):

@app.get("/async") def func_async(): start = time.time() task = [asyncio.sleep(1) for i in range(10)] await asyncio.gather(*tasks) end = time.time() return {"time":f'{end-start:.2f}s'}

使用 FastAPI 框架搭建 Web 服务

第一个 FastAPI 程序

1.创建项目

FastAPI → 存储位置及项目名称 → 创建虚拟环境 → Create

2.运行项目

方法一:点击右上角的绿色三角就可以运行啦

方法二:

先点击左侧的terminal进入到命令行里

方法二:输入uvicorn main:app --reload命令启动命令

3. 访问项目

http://127.0.0.1:8000/ 访问路由--前端请求数据的接口

http://127.0.0.1:8000/http://127.0.0.1:8000/docs 访问交互式文档http://127.0.0.1:8000/

路由

路由就是URL 地址处理函数之间的映射关系,它决定了当用户访问某个特定网址时,服务器应该执行哪段代码来返回结果。

# 访问hello,响应结果--msg:hello fastapi @app.get("/hello") async def get_hello(): return {"msg": "Hello fastAPI"}

练习

访问路径:/user/hello,响应结果:我正在学习,不要打扰我

@app.get("/user/hello") async def get_hello_user(): return {"msg": "我正在学习,不要打扰我"}

参数简介和路径参数

同一段接口逻辑,根据参数不同返回不同的数据

  • 参数就是客户端发送请求时附带的额外信息和指令
  • 参数的作用是让同一个接口能根据不同的输入,返回不同的输出,实现动态交互

参数分类

路径参数

  • 位置:URL 路径的一部分 /card/{id}
  • 作用:指向唯一的、特定的 资源
  • 方法:GET
@app.get("/card/{id}") async def get_card(id: int): return {"id": id,"title" : f"这是第{id}张卡"}

int 是参数类型注解

练习

以用户 id 为路径参数设计 URL,要求响应结果包含用户 id 和 名称(普通用户 id)

@app.get("/user/{id}") async def get_user_id(id: int): return {"id":id,"name":f"普通用户{id}"}
path参数注解

FastAPI 允许为参数声明额外的信息和校验

导入 FastAPI 的 Path 函数

Path 参数说明
...必填
gt/ge lt/le(是int的限制大于/大于等于 小于/小于等于
description描述
min_length max_length(是str的限制长度限制
from fastapi import FastAPI,Path @app.get("/card/{id}") async def get_card(id: int=Path(...,ge=1,le=100,description="卡id,取值范围1~100")): return {"id": id,"title" : f"这是第{id}张卡"}

如果输入不在该范围的数字,就会出现

"msg":"Input should be less than or equal to 100"
练习

接口:以用户名为参数设计URL,要求名称长度为2~6

@app.get("/user/{name}") async def get_user_id(name: str=Path(...,min_length=2,max_length=6,description="用户名长度2~6")): return {"name":f"我的名字是{name}"}

查询参数

  • 位置:URL? 之后 k1=v1&k2=v2
  • 作用:对资源集合进行过滤、排序、分页等操作
  • 方法:GET

原生的:

# skip:跳过的记录数,limit:返回的记录数 @app.get("/user/user_list") async def get_user_list(skip: int,limit: int=10): return {"skip":skip,"limit":limit}
http://127.0.0.1:8000/user/user_list?skip=0&limit=10
Query类型注解
@app.get("/user/user_list") async def get_user_list(skip: int=Query(0,description="这是跳过的记录数"), limit: int=Query(10,description="这是返回的记录数")): return {"skip":skip,"limit":limit}

请求体参数

  • 位置:HTTP 请求的消息体 (body)中
  • 作用:创建、更新资源 携带大量数据,如: JSON
  • 方法:POST、PUT 等

在HTTP协议中,一个完整的请求由三部分组成:

① 请求行​:包含方法、URL、协议版本

② 请求头​:元数据信息(Content-Type、Authorization等)

③ 请求体​:实际要发送的数据内容

from pydantic import BaseModel class User(BaseModel): username: str password: str age:int grade:int @app.post("/user") async def create_user(user:User): return user
类型注解——Filed
Path 参数说明
...必填
gt/ge lt/le(是int的限制大于/大于等于 小于/小于等于
default默认值
description描述
min_length max_length(是str的限制长度限制
from fastapi import FastAPI from pydantic import BaseModel,Field # 创建实例 app = FastAPI() @app.get("/") async def root(): return {"message": "你好哈哈哈哈"} # 注册用户名和密码 →str class User(BaseModel): username: str=Field("王麻子",min_length=2,max_length=6) password: str=Field("<PASSWORD>",min_length=3) @app.post("/user") async def create_user(user:User): return user

响应类型

默认情况下,FastAPI 会自动将路径操作函数返回的 Python 对象(字典、列表、Pydantic 模型等),经由 jsonable_encoder 转换为 JSON 兼容格式,并包装为 JSONResponse 返回。这省去了手动序列化的步骤,让开发者能更专注于业务逻辑。 如果需要返回非 JSON 数据(如 HTML、文件流),FastAPI 提供了丰富的响应类型来返回不同数据

响应类型用途示例
JSONResponse默认响应,返回JSON数据return {"key": "value"}
HTMLResponse返回HTML内容return HTMLResponse(html_content)
PlainTextResponse返回纯文本return PlainTextResponse("text")
FileResponse返回文件下载return FileResponse(path)
StreamingResponse流式响应生成器函数返回数据
RedirectResponse重定向return RedirectResponse(url)

JSON 格式

默认情况下,FastAPI 会自动将路径操作函数返回的Python 对象(字典、列表、Pydantic 模型等),经由 jsonable_encoder转换为JSON兼容格式,并包装为 JSONResponse 返回。

@app.get("/") async def root(): return {"message": "你好哈哈哈哈"}

响应类型设置方式--装饰器中指定响应类

场景:固定返回类型(HTML、纯文本等)

HTML格式

设置响应类为 HTMLResponse,当前接口即可返回 HTML 内容

from fastapi import FastAPI from fastapi.responses import HTMLResponse # 创建实例 app = FastAPI() @app.get("/") async def root(): return {"message": "你好哈哈哈哈"} # 接口→响应HTML @app.get("/html", response_class=HTMLResponse) async def html(): return HTMLResponse("<h1>这是一级标题html</h1>")

响应类型设置方式--返回响应对象

场景:文件下载、图片、流式响应

文件格式

FileResponse 是 FastAPI 提供的专门用于高效返回文件内容(如图片、PDF、Excel、音视频等)的响应类。它能够智能处理文件路径 、媒体类型推断、范围请求和缓存头部,是服务静态文件的推荐方式。

from fastapi import FastAPI from fastapi.responses import FileResponse # 创建实例 app = FastAPI() @app.get("/") async def root(): return {"message": "你好哈哈哈哈"} # 接口→响应HTML @app.get("/file") async def file(): path = "img.png" return FileResponse(path)

响应类型设置方式--自定义响应数据格式

response_model 是路径操作装饰器(如 @app.get或 @app.post)的关键参数,它通过一个Pydantic模型来严格定义和约束 API 端点的输出格式。这一机制在提供自动数据验证和序列化的同时,更是保障数据安全性的第一道防线。

首先是正常模式:

from fastapi import FastAPI from pydantic import BaseModel # 创建实例 app = FastAPI() @app.get("/") async def root(): return {"message": "你好哈哈哈哈"} # 用户接口 响应数据格式 class User(BaseModel): username : str age : int grade : str @app.post("/user/{age}", response_model=User) async def create_user(age:int): return { "username": f"这是{age}岁人的名字", "age": age, "grade": f"这是{age}岁人的年级" }

但是如果按照下面的写法就会:

@app.post("/user/{age}", response_model=User) async def create_user(age:int): return { "username": f"这是{age}岁人的名字", "age": age }

缺少grade,就会出现下面的结果:

异常处理

对于客户端引发的错误(4xx,如资源未找到、认证失败),应使用 fastapi.HTTPException 来中断正常处理流程, 并返回标准错误响应 。

from fastapi import FastAPI,HTTPException # 创建实例 app = FastAPI() @app.get("/") async def root(): return {"message": "你好哈哈哈哈"} # 用户接口 响应数据格式 @app.get("/user/{id}") async def user(id:int): id_list = [1,2,3,6,9,10,4] if id not in id_list: raise HTTPException(status_code=404,detail="404 not found") return {"id":id}

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

YOLOFuseLabelbox商业标注平台合作可能性

YOLOFuse Labelbox&#xff1a;构建多模态目标检测的工业化闭环 在智能安防、夜间巡检和自动驾驶感知系统中&#xff0c;一个老生常谈却始终棘手的问题浮出水面&#xff1a;当夜晚降临、浓雾弥漫或强光眩目时&#xff0c;仅依赖可见光摄像头的目标检测模型往往“失明”。即便最…

作者头像 李华
网站建设 2026/4/1 21:19:01

YOLOFuse备案进度公示:ICP许可证办理中

YOLOFuse备案进度公示&#xff1a;ICP许可证办理中 在智能安防、自动驾驶和工业检测日益依赖视觉感知的今天&#xff0c;一个现实问题始终困扰着开发者&#xff1a;当夜晚降临、浓雾弥漫或雨雪交加时&#xff0c;传统基于可见光的目标检测系统往往“失明”。摄像头拍到的画面模…

作者头像 李华
网站建设 2026/4/1 5:41:53

YOLOFuseCSDN问答置顶帖:新手常见问题集中解答

YOLOFuse&#xff1a;让多模态目标检测真正“开箱即用” 在夜间监控、森林防火或自动驾驶的边缘场景中&#xff0c;仅依赖可见光摄像头的目标检测系统常常“失明”——低光照下细节丢失&#xff0c;雾霾烟尘中轮廓模糊。而红外成像虽能穿透黑暗捕捉热辐射&#xff0c;却缺乏纹…

作者头像 李华
网站建设 2026/3/30 15:40:26

零基础掌握ES6语法:Generator函数入门示例

从“暂停”开始理解JavaScript&#xff1a;Generator函数的实践与思考你有没有想过&#xff0c;一个函数执行到一半能停下来&#xff0c;等你想让它继续的时候再接着运行&#xff1f;这听起来像是科幻电影里的桥断点续传&#xff0c;但在 JavaScript 中&#xff0c;这种能力真实…

作者头像 李华
网站建设 2026/3/31 19:47:40

13.4 通过eBPF、Cilium、Hubble实现零侵入可观测性

13.4 通过eBPF、Cilium、Hubble实现零侵入可观测性 在云原生时代,网络可观测性变得越来越重要。传统的网络监控工具往往需要在网络设备上安装代理或修改配置,这不仅增加了复杂性,还可能影响网络性能。Cilium和Hubble作为基于eBPF的网络解决方案,为我们提供了一种全新的零侵…

作者头像 李华