FastAPI 从入门到实战:构建高性能 Python Web API 的完整指南

FastAPI 从入门到实战:构建高性能 Python Web API 的完整指南

文章目录

一、什么是FastAPI?
1、FastAPI简介
FastAPI是一个现代、高性能的Python Web框架,专门用于构建API接口。它基于标准的Python类型提示,充分利用Python3.8及更高版本的新特性,让开发者能够以极高的效率构建高性能的Web API。
简单来说,FastAPI 就像是一个智能的 API 建造工厂:
你只需要告诉它你想要什么样的数据(通过 Python类型提示),它自动帮你处理数据验证、文档生成、错误处理等繁琐工作,最终给你一个高性能、易于维护的 API 服务。
2、FastAPI 的核心优势
与传统框架对比优势:
相比Flask:FastAPI提供自动API文档、数据验证、依赖注入等开箱即用功能。
相比Django:FastAPI更轻量级,专注于API开发,性能更优。
相比传统方式:减少大量样板代码,提高代码可维护性。
FastAPI的特点:
高性能: 基于Starlette和Pydantic,利用异步(asynchronous)编程,提供出色的性能。
自动文档生成: 自动生成交互式API文档,支持Swagger UI和ReDoc,让API的理解和测试更加直观。
类型注解支持: 利用Python的类型提示,提供更严格的输⼊验证和更好的代码提示。
异步支持: 支持异步请求处理,使得处理IO密集型任务更加高效。

就举个简单例子来看:
传统方式中,如果你要接收用户注册信息,需要手动检查:用户名是否为空邮箱格式是否正确密码长度是否足够

而在 FastAPI 中,你只需要定义数据模型,这些检查都会自动完成!
二、环境搭建与基础配置
FastAPI依赖Python 3.8及更高版本,在此基础上,按住Win+R,打开命令提示符输入:
pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/
另外,还需要下载一个服务器,下载指令为:
pip install “uvicorn[standard]” https://mirrors.aliyun.com/pypi/simple/
PyCharm项目创建FastAPI的步骤如下:
在这里插入图片描述
三、FastAPI应用
第1步:从最简单的例子开始,理解FastAPI的基本结构
# 导入FastAPI框架from fastapi import FastAPI # 创建 FastAPI 应用实例# 这个 app 对象是我们应用的入口点 app = FastAPI()# @app.get("/") 表示当用户访问根路径时,执行下面的函数# 使用FastAPI的装饰器将read_root函数注册为GET路由,根路径"/"的处理函数@app.get("/")defread_root():# 返回一个包含问候语和成功状态的JSON响应return{"message":"Hello, FastAPI!","status":"success"}
代码解析:
首先要导入FastAPI类:
from fastapi import FastAPI
创建FastAPI实例:
app = FastAPI()
这一步创建了一个FastAPI应用的实例,它将用于定义和管理应用的各个组件,包括路由。FastAPI是FastAPI框架的主要类。
@app.get(“/”):这是一个装饰器,告诉FastAPI当前HTTP方法是GET,且访问路径是"/"(根目录),然后执行下面的read_root()函数。函数返回一个包含{"message": "Hello, FastAPI!", "status": "success"}的字典,特别要注意的点是:return返回的数据会被FastAPI自动转换为JSON格式
运行和测试应用:
点击PyCharm左下方的工具栏终端:
在这里插入图片描述
打开之后输入:uvicorn main:app 其中,main代表创建的Python文件名,app代表创建的FastAPI应用实例名称。再点击出现的网址(图中出现的蓝色的字):
在这里插入图片描述
就会在浏览器中显现出刚才read_root()函数返回的信息:
在这里插入图片描述
第2步:理解路由和请求处理
路径参数可以让我们在URL中传递数据,比如获取特定用户的信息
# 导入FastAPI框架from fastapi import FastAPI # 创建 FastAPI 应用实例# 这个 app 对象是我们应用的入口点 app = FastAPI()# 使用FastAPI的装饰器定义GET路由,路径为/users/{user_id}@app.get("/users/{user_id}")defget_user(user_id:int):# 返回一个包含用户信息的字典return{"user_id": user_id,"name":f"用户{user_id}","message":"获取用户信息成功"}
注:{user_id}是一个路径参数,用花括号表示,在浏览器访问时输入的路径必须要写入参数,否则会返回错误
在这里插入图片描述
此外,还给出了类型提示:user_id: int,告诉FastAPI这个参数应该是整数,FastAPI会自动验证,如果用户传入
“abc” 这样的非数字,FastAPI 会自动返回错误
在这里插入图片描述
查询参数是URL中?后面的部分,用于可选的数据传递:
# 导入FastAPI框架from fastapi import FastAPI # 创建 FastAPI 应用实例# 这个 app 对象是我们应用的入口点 app = FastAPI()@app.get("/homes")# 定义一个函数,接收用户名和密码参数,密码参数可选defhome1(username:str, userpass:str|None=None):# 返回一个包含学生信息的列表,每个学生信息是一个字典,包含学号、姓名和性别return{"message":"您好","用户名": username,"密码": userpass}
注:userpass: str | None = None,这是说明userpass这个参数可以为空,即在浏览器搜索时不一定要输入该参数,该参数为可选参数。
在这里插入图片描述


在这里插入图片描述
第3步:处理POST请求
POST请求,相对于GET请求相对更安全, 想要检测POST请求是否成功,还需要与请求代码作为客户端。
服务器端代码为:
import uvicorn from fastapi import FastAPI from fastapi import Request # 创建 FastAPI 应用实例# 这个 app 对象是我们应用的入口点 app = FastAPI()@app.post("/get_login")# 给参数设置空值必须放在参数的最末尾defget_login(request: Request):""" 处理登录请求的函数 接收用户名和密码参数,验证后返回相应的登录结果 参数: request (Request): 包含查询参数的请求对象 返回: dict: 包含登录消息的字典 """# query_params:可以接收用户传递的参数# 需要将参数进行单独的获取,可以直接使用["参数名称"]# 从请求参数中获取用户名 username = request.query_params["username"]# 从请求参数中获取密码 userpass = request.query_params["userpass"]# 验证用户名和密码是否正确if username =="admin"and userpass =="admin123":# 如果验证成功,返回欢迎消息return{"message":f"{username}您好"}else:# 如果验证失败,返回登录失败消息return{"message":"登录失败"}if __name__ =='__main__': uvicorn.run(app, host="127.0.0.1", port=8000)
注:uvicorn: 是ASGI 服务器,负责运行 FastAPI 应用和处理网络请求
Request:用于请求对象,包含客户端发送的所有请求信息
query_params:可以接收用户传递的参数,包含 URL 中 ? 后面的所有参数。
_ _ name _ _ == ‘_ _ main _ _’: 确保直接运行此文件时才启动服务器。
uvicorn.run(): 启动 ASGI 服务器。
port为端口,可以更改当前的端口号。
客户端的代码为:
# 导入requests库,用于发送HTTP请求import requests # 导入json库,用于处理JSON数据import json u_name =input("请输入您的用户名:") u_pass =input("请输入您的密码:") params ={"username": u_name,"userpass": u_pass,} url ="http://127.0.0.1:8000/get_login"# 向post请求中传入参数:params res = requests.post(url, params=params) json_data = json.loads(res.text)print(json_data["message"])
注:requests 库会构建完整的 HTTP POST 请求,
params 参数会将数据编码到 URL查询字符串中,
json.loads(): 将 JSON 字符串解析为 Python 字典,
res.text: 响应体的原始文本内容。
要注意先运行服务器端的代码,再运行客户端的代码,先后顺序颠倒的话会客户端的响应无法得到回复,会报错!
在这里插入图片描述
四、FastAPI综合应用案例
服务器端代码:
import uvicorn from fastapi import FastAPI from fastapi import Request app = FastAPI()# 添加用户数据存储 user_data =[{"用户名":"username123","密码":"abc_123456"}]# 添加你原来的函数定义defget_my_login(s):deflogin(fn):definner(*args):if s =="登录":return fn(*args)elif s =="注册":return fn(*args)return inner return login @get_my_login("注册")defget_register(*args):for i in user_data:if i["用户名"]== args[0]:return-1 sd ={} sd["用户名"]= args[0] sd["密码"]= args[1] user_data.append(sd)return1@get_my_login("登录")defget_login(*args): is_ok =0for i in user_data:if i["用户名"]== args[0]and i["密码"]== args[1]: is_ok =1return is_ok return is_ok @app.get("/register/{name}")defapi_register(request: Request, name:str): password = request.query_params.get("password","")# 验证用户名和密码不为空ifnot name ornot password:return{"message":"用户名和密码不能为空"}# 验证用户名长度大于6iflen(name)<=6:return{"message":"用户名长度必须大于6"}iflen(password)<=8:return{"message":"密码长度必须大于8"}if"_"notin password:return{"message":"密码必须包含下划线"}ifnotany(char.isdigit()for char in password):return{"message":"密码必须包含数字"}ifnotany(char.isalpha()for char in password):return{"message":"密码必须包含字母"}# 检查用户名是否已存在for user in user_data:if user["用户名"]== name:return{"message":"用户名已存在"}# 调用注册函数 result = get_register(name, password)if result ==1:return{"message":"注册成功","username": name }else:return{"message":"注册失败"}# 修复:改为 /login/{name} 路由@app.get("/login/{name}")defapi_login(request: Request, name:str): password = request.query_params.get("password","")ifnot name ornot password:return{"message":"用户名和密码不能为空"} result = get_login(name, password)# 取消注释if result >0:return{"message":f"欢迎{name}"}else:return{"message":"登录失败,用户名或密码不正确!"}# 添加查看所有用户的接口(用于测试)@app.get("/users")defget_all_users():return{"users": user_data}if __name__ =='__main__': uvicorn.run(app, host="127.0.0.1", port=8000)
客户端代码:
import json import requests defclient_program():whileTrue: types =input("请输入您的操作:1、登录\t\t2、注册\t\t3、退出\n")if types =="1": u_name =input("请输入用户名:") u_pass =input("请输入密码:")# 发送请求到服务器try: res = requests.get(f"http://127.0.0.1:8000/login/{u_name}?password={u_pass}") json_data = res.json()# 使用 .json() 方法代替 json.loadsprint(json_data["message"])except Exception as e:print(f"连接服务器失败: {e}")elif types =="2": u_name =input("请输入用户名:") u_pass =input("请输入密码:")# 发送注册请求到服务器try: res = requests.get(f"http://127.0.0.1:8000/register/{u_name}?password={u_pass}") json_data = res.json()print(json_data["message"])except Exception as e:print(f"连接服务器失败: {e}")elif types =="3":print("退出程序")breakelse:print("输入有误,请重新输入")if __name__ =="__main__": client_program()
注:在该案例中用到了Python闭包的知识点,不懂这一点的可以去我的主页看相关的博文。
在这里插入图片描述

结语

FastAPI以其现代化的设计理念,为Python Web开发开启了新的篇章。从简单的路由定义到复杂的API构建,它用优雅的语法和强大的功能,让开发者能够专注于业务逻辑而非繁琐的细节。正如我们所见,类型提示不仅是代码的约束,更是与框架对话的桥梁;自动文档生成不仅节省时间,更是对开发体验的深度优化。
掌握FastAPI,意味着我们不仅学会了一个框架,更掌握了构建高效、可靠Web服务的现代方法论。在这个数据驱动的时代,能够快速构建高性能API的能力,将成为每一位Python开发者不可或缺的技能。从第一个"Hello World"到完整的应用系统,FastAPI正陪伴我们在这条道路上稳步前行。

Read more

基于深度学习yolo系列+deepseek+qwen大模型的智能识别系统 中草药检测+行人车辆检测+垃圾分类检测+茶叶病虫害检测+无人机目标检测

基于深度学习yolo系列+deepseek+qwen大模型的智能识别系统 中草药检测+行人车辆检测+垃圾分类检测+茶叶病虫害检测+无人机目标检测

智能检测系统综合概述 定制联系文末卡片 目标检测系统应用场景表 系统类型检测目标适用领域中草药检测45种中草药中医药、药材鉴定脑肿瘤检测胶质瘤等脑部肿瘤医疗影像诊断行人车辆检测行人、车辆等多目标交通监控、安防玉米病虫害检测6种玉米病害农业植保裂缝检测6种表面缺陷工业质检、建筑检测垃圾分类检测4类垃圾环保、智慧城市遥感目标检测地理空间目标遥感分析、军事侦察西瓜病虫害检测多种西瓜病害农业种植管理海洋生物检测海豚、鲨鱼等海洋科研、教育茶叶病虫害检测6种茶叶病害茶叶种植、农业 包括但不限于此!!!! 🏗️ 统一技术架构 所有系统都基于相似的模块化技术栈: • 前端:Vue3 + Element-Plus + TypeScript + Echarts • 后端:SpringBoot + MyBatis-Plus + Flask • 深度学习:YOLO系列 + PyTorch • 数据库:MySQL • 大模型集成:DeepSeek + Qwen 🔄 标准化功能模块 检测功能四合一 1. 图片检测 - 单张图片上传识别 2. 批量

By Ne0inhk
FPGA读写DDR4 (一)MIG IP核控制信号

FPGA读写DDR4 (一)MIG IP核控制信号

前言         这几个星期在倒腾DDR4内存的读写控制,期间看了不少资料,这几天终于完工了于是想着把做过的内容总结一下,于是有了这篇文章,由于控制DDR4的内容很多,这一篇文章就只讲基础的,也就是DDR4的控制IP核 MIG的控制信号。         主要参考内容:【正点原子】MPSoC-P4之FPGA开发指南_V2.0,[XILINX] pg150-ultrascale-memory-ip-en-us-1.4 MIG IP核控制信号 IP核创建界面         MIG IP核(memory interface generator)是用户与DDR4进行沟通的桥梁,因为如果我们自己去写直接DDR4代码的话,其内容将会非常复杂,而且即便写出来其性能可能也不会好,以XILINX提供的MIG IP核为例,在综合布线后查看utilization,能发现MIG IP核足足使用了约7500个LUT和9000个register资源,足以看出其编写的复杂,不过对于我们普通用户,能够操作MIG提供的用户接口就我觉得就算差不多了,既然要使用IP核,我们就从IP核的创建界面开始说起,

By Ne0inhk

Vivado 2019.2安装破解教程:零基础手把手指南

从零搭建Vivado 2019.2开发环境:不只是“破解”,更是理解FPGA工具链的开始 你是否曾在尝试启动 Vivado 的时候,被一个弹窗拦住去路:“License required for synthesis”? 或者刚下载完庞大的安装包,面对一堆补丁文件却不知从何下手? 这并不是你技术能力的问题。事实上, 每一个 FPGA 开发者都曾经历过这个阶段 ——在官方授权门槛和学习成本之间挣扎。而 Vivado 2019.2,作为 Xilinx 工具链中最后一个稳定、功能完整且社区支持广泛的经典版本,至今仍是高校实验、个人项目甚至部分企业原型验证的首选。 但它的安装与授权配置过程,远比点几下“下一步”复杂得多。本文不打算教你如何“绕过法律”,而是带你 真正搞懂整个系统是怎么运作的 :为什么需要许可证?补丁到底改了什么?Xilinx License Manager 背后又是怎样的机制? 更重要的是,我会手把手带你走完一条清晰、可复现、稳定性高的部署路径,

By Ne0inhk

yolo13-C3k2-WDBB_海下垃圾清理机器人环境感知与障碍物识别系统_1

本数据集为海下垃圾清理机器人环境感知任务提供训练支持,包含4485张经过预处理的水下环境图像,采用YOLOv8格式进行标注。数据集分为训练集、验证集和测试集三个部分,所有图像均经过自动方向调整( stripping EXIF方向信息)并统一拉伸至640×60像素尺寸,未应用任何图像增强技术。数据集共包含三个类别:‘bucket’(桶)、‘gate’(门)和’obstacle’(障碍物),这些类别代表了海下垃圾清理机器人可能面临的主要环境目标和障碍物。该数据集采用CC BY 4.0许可证授权,由qunshankj平台用户提供,通过qunshankj计算机视觉平台完成图像收集、组织和标注工作。数据集的构建旨在支持开发能够有效识别水下环境中的垃圾容器、结构门和其他障碍物的计算机视觉系统,从而提升海下垃圾清理机器人的自主导航和目标识别能力。 1. 深入解析87种目标检测模型:从经典到前沿的全面指南 目标检测作为计算机视觉的核心任务之一,在过去十年里经历了飞速发展。从传统的R-CNN系列到如今的YOLO系列,各种创新模型层出不穷。本文将深入解析87种主流目标检测模型,帮助你全面了解这个领域

By Ne0inhk