FastAPI 系列文章目录
- 第一篇: 通过 Python FastAPI 开发一个快速的 Web API 项目
- 第二篇: FastAPI 的路由介绍与使用
- 第三篇: FastAPI 开发中数据校验利器 Pydantic 介绍与集成使用
- 第四篇: FastAPI 快速开发 Web API 项目: 路径参数和查询参数
- 第五篇: 从 Flask 转换到 FastAPI(翻译)
- 第六篇: FastAPI 快速开发 Web API 项目: 响应模型与错误处理
- 第七篇: FastAPI 快速开发 Web API 项目: 模板和 Jinja 介绍
- 第八篇: FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库
- 第九篇: FastAPI 快速开发 Web API 项目: 通过 SQLAlchemy 进行数据操作
- 第十篇: FastAPI 快速开发 Web API 项目:FastAPI 中的最小项目
- 第十一篇:FastAPI 快速开发 Web API 项目:在 FastAPI 应用程序中构建项目结构
- 第十二篇:FastAPI 快速开发 Web API 项目:实现 FastAPI 的用户注册和登录路由
- 第十三篇:FastAPI 快速开发 Web API 项目:实现 FastAPI 的待办事项路由增删改查
实现待办事项的查询路由
根据上图中,我们已经时间了左边的用户路由,下一步就是为上图右边的待办事项操作(增删改查)的路由。让我们看看具体步骤:
第 1 步,首先导入依赖项并定义待办事项的路由:
python
from typing import List
from fastapi import APIRouter, Body, HTTPException, status
from models.events import Event
event_router = APIRouter(
tags=["Events"]
)
events = []
第 2 步,需要定义出查询路由,以查找所有待办事项和查找一个符合提供的 ID 的待办事项:
less
@event_router.get("/", response_model=List[Event])
async def get_all_events() -> List[Event]:
return events
@event_router.get("/{id}", response_model=Event)
async def get_event(id: int) -> Event:
for event in events:
if event.id == id:
return event
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Event with supplied id does not exist"
)
在第二个路由中,当所提供 ID 的待办事项不存在时,我们会触发 HTTP_404_NOT_FOUND
异常。
实现待办事项的新建路由
让我们来实现创建待办事项、删除单个待办事项和删除数据库中包含的待办事项的路由。
python
@event_router.post("/new")
async def create_event(body: Event = Body(...)) -> dict:
events.append(body)
return {
"message": "Event created successfully"
}
@event_router.delete("/{id}")
async def delete_event(id: int) -> dict:
for event in events:
if event.id == id:
events.remove(event)
return {
"message": "Event deleted successfully"
}
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Event with supplied ID does not exist"
)
上面的程序也非常容易理解,当我们请求 /new
的时候,我们就将待办事项添加到 events 中,当删除的时候,通过 id 遍历所有的 events,当找到存在相同的 id 时,在 events 列表中移除该待办事项,如果遍历完整个 events,没有找到的话,触发 HTTP_404_NOT_FOUND
错误,同时响应 Event with supplied ID does not exist
消息。
更新 main.py
文件
现在我们已经实现了路由,让我们更新我们的路由配置,以便 在 main.py
中加入事件路由:
python
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from routes.users import user_router
from routes.events import event_router
import uvicorn
app = FastAPI()
# Register routes
app.include_router(user_router, prefix="/user")
app.include_router(event_router, prefix="/event")
@app.get("/")
async def home():
return RedirectResponse(url="/event/")
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8080, reload=True)
测试待办事项路由功能
改好代码后,点击保存会自动重启服务:
- 测试
GET
方法
首先测试查询所有的事件 curl -X 'GET' 'http://127.0.0.1:8080/event/' -H 'accept: application/json'
,此时会得到一个为空的列表,如下图:
- 测试
POST
方法
接着,我们执行 new 路由,看是否能新建一个待办事项:
bash
curl -X 'POST' \
'http://127.0.0.1:8080/event/new' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"id": 1,
"title": "Go to gym",
"description": "Doing cardio, lifting dumbbells",
"time": "2023-12-01 19:59:59",
"tags": [
"exercise",
"fit",
"physical"
],
"location": "Shenzhen Marvel Fitness",
"image": "https://xxx.png"
}'
新建成功的话会收到 Event created successfully
响应消息,如下图:
- 测试
GET/{id}
方法
此时,再遍历所有的待办事项数据的话,就有如下刚刚新建的结果了,你也可以试试:
bash
$ curl -X 'GET' 'http://127.0.0.1:8080/event/' -H 'accept: application/json'
[{"id":1,"title":"Go to gym","description":"Doing cardio, lifting dumbbells","tags":["exercise","fit","physical"],"time":"2023-12-01T19:59:59","location":"Shenzhen Marvel Fitness","image":"https://xxx.png"}]
因为只有一条数据,也可以通过请求 curl -X 'GET' 'http://127.0.0.1:8080/event/1' -H 'accept: application/json'
来获取这条数据
arduino
curl -X 'GET' 'http://127.0.0.1:8080/event/1' -H 'accept: application/json'
{"id":1,"title":"Go to gym","description":"Doing cardio, lifting dumbbells","tags":["exercise","fit","physical"],"time":"2023-12-01T19:59:59","location":"Shenzhen Marvel Fitness","image":"https://xxx.png"}
如果使用这条命令 curl -X 'GET' 'http://127.0.0.1:8080/event/2' -H 'accept: application/json'
则会收到如下的响应信息:
json
{"detail":"Event with supplied id does not exist"}
如图:
- 测试
DELETE
方法
最后,让我们删除刚刚新建的待办事项,以确认待办事项路由正常工作:
bash
curl -X 'DELETE' 'http://127.0.0.1:8080/event/1' -H 'accept: application/json'
如果得到这条响应的话,则表示我们的路由完全没问题:
json
{"message":"Event deleted successfully"}
如下图所示:
我们已经成功地为我们的 todo 应用程序实现了路由和模型。同时也进行了测试,得到了预期的结果。
最终本项目的完整的结构如下图:
Ps: 这里图中的
database
文件夹下的内容还没有实现,现在只是个框架。
总结
至此,我们学习了如何构建一个 FastAPI 应用程序,并为一个待办事项 todo 应用程序实现路由和模型。我们利用了之前的文章的内容,从创建虚拟环境,搭建项目结构,挨个实现模型和路由,但是美中不足的事我们还只是简单的利用了命令行的临时数据,还没有利用上数据库模拟真实物理数据。
像其他 Python 框架如 Django 和 Flask 一样,FastAPI 也能支持多种数据库 SQL 和 NoSQL,FastAPI 快速开发 Web API 项目: 连接 MySQL 数据库 已经介绍了如何连接 MySQL 数据,感兴趣的同学可以自行跳转。
至于如何在本项目中 todo 中连接数据库,怎么通过新建一个 database 文件夹连接数据库,今后我们将在其他文章中进行介绍。
希望本文能对你有所帮助,如果喜欢本文,可以点个关注。
下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。