文章目录
一、什么是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正陪伴我们在这条道路上稳步前行。