Python的fastapi快速入门
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于 Python 构建 API。它专为高效开发和运行而设计,结合了 Python 类型提示的强大功能,提供了自动生成交互式 API 文档的能力。
1、概述与安装
官方文档:FastAPI
官方源码:https://github.com/tiangolo/fastapi
1.1简介
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于基于 Python 构建 API。它专为高效开发和运行而设计,结合了 Python 类型提示的强大功能,提供了自动生成交互式 API 文档的能力。
1.2主要特点
高性能
FastAPI 基于 Starlette(轻量级 ASGI 框架)和 Pydantic(数据验证库),性能接近 Node.js 和 Go 等语言的高性能框架。
开发效率高
自动生成 OpenAPI 和 JSON Schema 文档,支持交互式 API 测试(通过 Swagger UI 或 ReDoc)。减少手动编写文档的工作量。
类型安全
充分利用 Python 的类型提示功能,提供强大的数据验证和编辑器智能提示支持,减少运行时错误。
异步支持
原生支持异步请求处理(基于 ASGI),适合现代高并发应用场景,如微服务和高频 IO 操作。
适用场景
- 构建 RESTful API 或 GraphQL API
- 开发微服务架构的后端服务
- 需要自动生成 API 文档的项目
- 对性能要求较高的 Web 应用
1.3安装与创建
- 环境准备(Python 3.7+)
- 安装FastAPI和相关依赖
- 创建第一个FastAPI应用
- 运行开发服务器(uvicorn)
1.3.1 安装fastapi库和uvicorn库
命令行:pip install fastapi -i https://mirrors.aliyun.com/pypi/simple/
命令行:pip install "uvicorn[standard]" -i https://mirrors.aliyun.com/pypi/simple/
1.3.2 创建api项目
第一步:

第二步:创建python文件
import uvicorn
from fastapi import FastAPI # 导入fastAPI,用于定义api
app = FastAPI() # 创建FastAPI实例
@app.get("/") # 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
return {"message": "Hello World"}
@app.get("/hello/{name}")
async def say_hello(name: str):
return {"message": f"Hello {name}"}
if __name__ == "__main__":
print("启动服务")
uvicorn.run("mian:app",host="127.0.0.1",port=8000,reload=True)
第三步:打开终端执行uvicorn main:app --reload
第一种启动方式:命令行


第二种启动方式直接运行:

此时可以再地址栏输入:127.0.0.1:8000/,输出如下:

输入:127.0.0.1:8080/hello/李四,得到输出如下:

2、案例
2.1 案例一
import uvicorn
from fastapi import FastAPI # 导入fastAPI,用于定义api
app = FastAPI() # 创建FastAPI实例
@app.get("/") # 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
return {"message": "Hello World"}
@app.get("/hello/{name}")
async def say_hello(name: str,password:str|None= None):
"""
异步处理HTTP GET请求,返回问候消息
参数:
name (str): 用户名称,从URL路径中获取
password (str | None): 可选的密码参数,默认为None
返回:
dict: 包含问候消息的字典,格式为{"message": "Hello {name},密码锁定为{password}"}
"""
return {"message": f"Hello {name},密码锁定为{password}"}
# @app.get("/hello/{name}")
# async def say_hello(name: str,password:[str,None]= None): # 这是第二种写法,定义密码为字符串或者空
# return {"message": f"Hello {name},密码锁定为{password}"}
if __name__ == "__main__":
print("启动服务")
uvicorn.run("mian:app",host="127.0.0.1",port=8000,reload=True)
2.2案例二
from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构
app = FastAPI() # 创建FastAPI实例
class Item(BaseModel):
"""
定义一个商品信息的数据模型类
属性:
name (str): 商品名称
price (float): 商品价格
is_offer (Union[bool, None]): 是否为优惠商品,可选属性,默认为None
"""
name: str
price: float
is_offer:Union[bool,None]=None
@app.get("/")
# 定义路由,访问根路径调用read_root函数,并返回Hello World字符串数据
async def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q:Union[str, None] = None):
"""
根据物品ID获取物品信息
参数:
item_id (int): 物品的唯一标识符
q (Union[str, None], optional): 查询参数,可选
返回:
dict: 包含物品ID和查询参数的字典
"""
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
# 测试访问:
async def update_item(item_id:int,item:Item):
"""
更新指定ID的物品信息
参数:
item_id (int): 要更新的物品的唯一标识符
item (Item): 包含物品信息的Item对象
返回:
dict: 包含物品名称和物品ID的字典
"""
return {"item_name": item.name, "item_id": item_id}
if __name__ == "__main__":
print("启动服务")
uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)
同时写一个test测试类用于测试
此为test测试模块
import requests
# 测试 GET
response = requests.get("http://127.0.0.1:8000/items/1")
print("GET响应:", response.json())
# 测试 PUT
# 准备要更新的商品数据,包含商品名称、价格和是否为特价商品的标识
data = {"name": "笔记本电脑", "price": 5999.99, "is_offer": True}
# 向指定的商品接口发送PUT请求,用于更新ID为1的商品信息
response = requests.put("http://127.0.0.1:8000/items/1", json=data)
# 输出服务器返回的响应结果
print("PUT响应:", response.json())
3、FastAPI交互式API文档
FastAPI自动生成交互式API文档,支持Swagger UI和ReDoc两种界面。这些文档基于OpenAPI标准,允许用户直接测试API端点。
3.1Swagger UI文档访问
启动FastAPI应用后,默认路径为/docs。该界面提供API端点列表、参数描述及实时测试功能。
- 访问方式:如
http://127.0.0.1:8000/docs(看你设置的域名加端口号) - 支持自动生成请求示例
- 可直接填写参数并发送请求
- 显示响应模型和状态码说明

3.2 交互式文档的优势
实时更新
系统或数据能够即时反映最新状态,无需手动刷新或干预。适用于动态数据监控、协同编辑、实时通信等场景,确保用户始终获取最新信息。
自动验证
通过预设规则或脚本自动检查数据的准确性、完整性或逻辑性。减少人工核对成本,常见于表单提交、API响应测试、数据库一致性检查等场景。
便于测试
设计或工具提供清晰的测试接口、模拟环境或调试支持,例如单元测试框架、沙箱环境、日志追踪等。降低测试复杂度,加速开发迭代。
4、路由api的分发
4.1创建api文件以及模块

4.2 csb.py(源码)
# 出版社分发路由配置
from fastapi import APIRouter
# 创建路由
api_cbs = APIRouter()
@api_cbs.get("/get")
async def get_cbs():
return {"method":"出版社分发路由get方法"}
@api_cbs.post("/post")
async def post_test():
return {"method":"出版社分发路由post方法"}
@api_cbs.put("/put")
async def put_test():
return {"method":"出版社分发路由put方法"}
@api_cbs.delete("/delete")
async def delete_test():
return {"method":"出版社分发路由delete方法"}
4.3 ts.py(源码)
# 图书分发路由配置
from fastapi import APIRouter
api_ts = APIRouter() # 创建路由
@api_ts.get("/get")
async def get_test():
return {"method":"图书分发路由get方法"}
@api_ts.post("/post")
async def post_test():
return {"method":"图书分发路由post方法"}
@api_ts.put("/put")
async def put_test():
return {"method":"图书分发路由put方法"}
@api_ts.delete("/delete")
async def delete_test():
return {"method":"图书分发路由delete方法"}
4.3 zz.py(源码)
# 作者分发路由配置
from fastapi import APIRouter
api_zz = APIRouter()
@api_zz.get("/get")
async def get_zz():
return {"method":"作者分发路由get方法"}
@api_zz.post("/post")
async def post_zz():
return {"method":"作者分发路由post方法"}
@api_zz.put("/put")
async def put_zz():
return {"method":"作者分发路由put方法"}
@api_zz.delete("/delete")
async def delete_zz():
return {"method":"作者分发路由delete方法"}
4.4 main1.py(分发api)
from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构
from api.ts import api_ts
from api.cbs import api_cbs # 导入三个api路由分发
from api.zz import api_zz
# 创建FastAPI应用实例,用于注册路由和处理HTTP请求
app = FastAPI()
# 注册图书相关路由,所有请求路径以/ts开头,标签为"图书"
app.include_router(api_ts, prefix="/ts", tags=["图书"])
# 注册出版社相关路由,所有请求路径以/cbs开头,标签为"出版社"
app.include_router(api_cbs, prefix="/cbs", tags=["出版社"])
# 注册作者相关路由,所有请求路径以/zz开头,标签为"作者"
app.include_router(api_zz, prefix="/zz", tags=["作者"])
if __name__ == "__main__":
print("启动服务")
uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)
在地址栏输入127.0.0.1:8000:/docs能够得到以下:
(注意其他占用8000端口号要记得关闭)

5、request对象
requests是Python中一个流行的HTTP库,用于发送HTTP请求和处理响应。requests对象通常指通过该库发起的请求或返回的响应对象,核心类是requests:Request和requests:Response。
主要功能
- 发送HTTP请求:支持GET、POST、PUT、DELETE等方法。
- 处理响应:自动解析响应内容(JSON、文本、二进制等)。
- 会话管理:通过
Session对象保持持久性参数(如cookies、headers)。 - 高级功能:超时设置、代理支持、文件上传等。
假设我们定义了request:Requests,那么该对象可以获取到那些信息呢?

代码如下:
from typing import Union # 导入Union,用于定义可选类型
import uvicorn # 引入uvicorn,用于启动服务
from fastapi import FastAPI,Request # 导入FastAPI,用于构建RESTful API
from pydantic import BaseModel # 引入pydantic类,用于定义数据结构
# 创建FastAPI应用实例,用于注册路由和处理HTTP请求
app = FastAPI()
@app.get("/homes")
async def homes(username:str,userpass:str|None = None):
"""
处理获取用户家庭信息的GET请求
参数:
username (str): 用户名
userpass (str|None): 用户密码,可选参数,默认为None
返回:
dict: 包含方法名、用户名和密码的字典
"""
return {"method":"gethome","用户名":username,"密码":userpass}
@app.get("/get_login")
async def get_login(request:Request):
"""
处理用户登录的GET请求
参数:
request (Request): HTTP请求对象,包含查询参数
返回:
dict: 登录结果信息,包括方法名、用户名和密码或错误信息
"""
try:
# 从请求查询参数中获取用户名和密码
username = request.query_params["username"]
userpass = request.query_params["userpass"]
# 验证用户名和密码是否匹配预设值
if username == "张三" and userpass == "123":
return {"method": "登入成功", "用户名": username, "密码": userpass}
else:
return {"登入失败"}
except Exception as e:
# 捕获异常并返回错误信息
return {"method": f"登录功能出错{e}"}
@app.post("/post_login")
async def get_login(request:Request):
"""
处理用户登录的POST请求
参数:
request (Request): HTTP请求对象,包含查询参数
返回:
dict: 登录结果信息,包括方法名、用户名和密码或错误信息
"""
try:
# 从请求查询参数中获取用户名和密码
username = request.query_params["username"]
userpass = request.query_params["userpass"]
# 验证用户名和密码是否匹配预设值
if username == "张三" and userpass == "123":
return {"method": "登入成功", "用户名": username, "密码": userpass}
else:
return {"登入失败"}
except Exception as e:
# 捕获异常并返回错误信息
return {"method": f"登录功能出错{e}"}
if __name__ == "__main__":
print("启动服务")
uvicorn.run("main1:app",host="127.0.0.1",port=8000,reload=True)
请求接口代码为:
第一种:get方法登录
import requests
# get登录 请求的写法
# 获取用户输入的用户名和密码,并向本地服务器发送登录请求
# 参数: 无
# 返回值: 无
# 功能:
# 1. 从标准输入获取用户名和密码
# 2. 向本地服务器发送GET请求进行登录验证
# 3. 打印服务器响应结果
username = input("请输入用户名:")
userpass = input("请输入密码:")
# 发送登录请求到本地服务器
res = requests.get(f"http://127.0.0.1:8000/get_login?username={ username}&userpass={userpass}")
# 输出服务器响应对象和响应文本内容
print(res)
print(res.text)
第二种:post方法登录
import requests
# post 登录的写法
username = input("请输入用户名:")
userpass = input("请输入密码:")
# 构造登录请求参数字典,包含用户名和密码
params = {"username":username,"userpass":userpass}
# 设置登录接口URL地址
url = "http://127.0.0.1:8000/get_login"
# 向登录接口发送POST请求,传递用户登录信息
res = requests.post(url,params=params)
print(res)
print(res.text)
更多推荐




所有评论(0)