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

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

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

相关推荐
coberup6 分钟前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境37 分钟前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫
monkey_meng38 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马41 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng44 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
小白学大数据1 小时前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
flashman9111 小时前
python在word中插入图片
python·microsoft·自动化·word
菜鸟的人工智能之路1 小时前
桑基图在医学数据分析中的更复杂应用示例
python·数据分析·健康医疗
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
秃头佛爷3 小时前
Python学习大纲总结及注意事项
开发语言·python·学习