两小时快速入门 FastAPI–第二回FastAPI 实战完成一个简单的 Todo 查询接口一、FastAPI 简介FastAPI 是一个用于开发 Web API 的 Python 框架支持路径参数、查询参数、类型校验和自动接口文档。本次练习使用 Python 列表临时保存 Todo 数据并通过不同接口实现获取全部任务按完成状态筛选任务统计任务数量根据 ID 查询单个任务项目启动后可以访问下面的地址查看 Swagger 接口文档http://127.0.0.1:8000/docs二、本次任务目标本次练习主要完成一个简单的 Todo 查询 API创建临时 Todo 数据获取全部 Todo根据完成状态筛选 Todo统计总任务数和已完成任务数根据任务 ID 查询单个 Todo使用curl.exe测试接口三、完成任务的整个流程1. 编写 Todo API打开项目中的main.py写入以下代码fromfastapiimportFastAPI# 创建 FastAPI 应用实例。# title 会显示在自动生成的 Swagger 文档页面里。appFastAPI(title我的两个小时FastAPI练习)# 定义一个 Todo 列表作为当前项目的临时数据。接口下的代办和状态# 这里没有连接数据库所以数据只保存在程序运行时的内存中。todos[{id:1,title:学习FastAPI,done:False},{id:2,title:写一个Todoapi,done:True},]# 定义根路径接口。# 当访问 http://127.0.0.1:8000/ 时会执行这个函数。app.get(/)defroot():# 返回一个简单的 JSON 消息用来表示服务已经正常启动。return{message:FastAPI 已经启动}# 定义获取 Todo 列表的接口。# done 是一个可选查询参数可以按完成状态筛选任务。# 例如/todos?donetrue 或 /todos?donefalseapp.get(/todos)deflist_todos(done:bool|NoneNone):# 如果没有传入 done 参数就直接返回全部 Todo。ifdoneisNone:returntodos# 如果传入了 done 参数就只返回状态匹配的 Todo。return[todofortodointodosiftodo[done]done]# 定义统计 Todo 数量的接口。# 这个接口会返回总任务数以及已经完成的任务数。app.get(/todos/count)deftodo_count():# total 表示全部任务数量。# completed 表示 done 为 True 的任务数量。return{total:len(todos),completed:len([todofortodointodosiftodo[done]]),}# 定义根据任务 id 获取单个 Todo 的接口。# todo_id 是路径参数例如访问 /todos/1 时todo_id 的值就是 1。app.get(/todos/{todo_id})defget_todo(todo_id:int):# 遍历 todos 列表查找 id 和传入参数一致的任务。fortodointodos:iftodo[id]todo_id:returntodo# 如果没有找到对应 id 的任务就返回提示信息。return{message:Todo not found}这里使用的todos是一个普通 Python 列表并没有连接数据库。因此数据只会保存在程序运行时的内存中。程序重新启动后数据会恢复为代码中定义的内容。结果如图所示2. 获取 Todo 列表获取全部任务的接口为GET /todos访问地址http://127.0.0.1:8000/todos还可以通过done查询参数筛选任务。查询已完成任务http://127.0.0.1:8000/todos?donetrue查询未完成任务http://127.0.0.1:8000/todos?donefalsedone没有出现在接口路径中因此它属于查询参数。3. 统计 Todo 数量统计接口为GET /todos/count使用 PowerShell 测试curl.exehttp://127.0.0.1:8000/todos/count返回结果{total:2,completed:1}其中total表示全部任务数量completed表示已经完成的任务数量4. 根据 ID 查询 Todo查询单个任务的接口为GET /todos/{todo_id}其中todo_id是路径参数。查询 ID 为1的任务curl.exehttp://127.0.0.1:8000/todos/1返回{id:1,title:学习FastAPI,done:false}查询 ID 为2的任务curl.exehttp://127.0.0.1:8000/todos/2返回{id:2,title:写一个Todoapi,done:true}如果传入的 ID 不存在接口会返回{message:Todo not found}需要注意固定路径/todos/count应写在动态路径/todos/{todo_id}前面避免 FastAPI 将count当成todo_id处理。四、总结本次练习完成了一个简单的 Todo 查询 API主要学习了使用 Python 列表临时保存数据使用查询参数筛选任务使用路径参数查询单个任务使用列表推导式统计和筛选数据使用curl.exe测试 FastAPI 接口理解固定路径和动态路径的定义顺序目前的接口只能查询数据下一步可以继续增加新增、修改和删除 Todo 的接口完成一个基础的 Todo CRUD 项目。