FastAPI 快速开发 Web API 项目:实现 FastAPI 的待办事项路由增删改查

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 文件夹连接数据库,今后我们将在其他文章中进行介绍。

希望本文能对你有所帮助,如果喜欢本文,可以点个关注。

下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。

相关推荐
这里有鱼汤6 分钟前
通过AI狂赚苹果26.6%,这套AI金融交易开源Agent彻底火了
后端·agent
陈敬雷-充电了么-CEO兼CTO10 分钟前
复杂任务攻坚:多模态大模型推理技术从 CoT 数据到 RL 优化的突破之路
人工智能·python·神经网络·自然语言处理·chatgpt·aigc·智能体
寻月隐君15 分钟前
【Solana 开发实战】轻松搞定链上 IDL:从上传到获取全解析
后端·web3·github
程序员爱钓鱼25 分钟前
Go项目上线部署最佳实践:Docker容器化从入门到进阶
后端·google·go
汪子熙27 分钟前
Visual Studio Code 中排除指定文件夹搜索的最佳实践与实现原理
后端·面试
YOLO大师36 分钟前
华为OD机试 2025B卷 - 小明减肥(C++&Python&JAVA&JS&C语言)
c++·python·华为od·华为od机试·华为od2025b卷·华为机试2025b卷·华为od机试2025b卷
xiao5kou4chang6kai41 小时前
【Python-GEE】如何利用Landsat时间序列影像通过调和回归方法提取农作物特征并进行分类
python·gee·森林监测·洪涝灾害·干旱评估·植被变化
kaikaile19951 小时前
使用Python进行数据可视化的初学者指南
开发语言·python·信息可视化
大P哥阿豪1 小时前
Go defer(二):从汇编的角度理解延迟调用的实现
开发语言·汇编·后端·golang
Par@ish1 小时前
【网络安全】恶意 Python 包“psslib”仿冒 passlib,可导致 Windows 系统关闭
windows·python·web安全