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 项目的结构 Demo,并实现了模型的定义,这一篇我们实现路由系统和主文件,并进行相应的测试。
实现路由
构建应用程序的下一步是为我们的应用程序接口设置路由系统。 我们将为待办事项和用户设计路由系统。用户路由将包括登录 、退出 和注册。通过身份验证的用户可以访问创建、更新和删除待办事项的路由,而用户可以在事件创建后查看事件。下图显示了两种路径之间的关系:
用户路由
在之前定义的注册路径中,我们使用了应用程序内的数据库。在添加新用户之前,该路由会检查数据库中是否存在具有类似电子邮件地址的用户。在 router/users.py
中定义:
python
from fastapi import APIRouter, HTTPException, status
from models.users import User, UserSignIn
user_router = APIRouter(
tags=["User"]
)
users = {}
@user_router.post("/signup")
async def signup_new_user(data: User) -> dict:
"""Create a new user"""
if data.email in users:
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail="User with supplied email address already exists"
)
users[data.email] = data
return {
"message": "User successfully registered!"
}
@user_router.post("/signin")
async def signin_new_user(data: UserSignIn) -> dict:
"""User login in"""
if data.email not in users:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="User does not exist"
)
if users[data.email].password != data.password:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="You input a wrong password"
)
return {
"message": "User signed in successfully!"
}
在登录路径中,第一步是检查数据库中是否存在这样的用户,如果不存在,就会出现异常。如果用户存在,应用程序将继续检查密码是否匹配,然后返回成功或异常信息。
启动程序
然后让我们来定义 main.py
文件,写入如下的代码:
python
from fastapi import FastAPI
from routes.users import user_router
import uvicorn
app = FastAPI()
# Register routes
app.include_router(user_router, prefix="/user")
if __name__ == "__main__":
uvicorn.run("main:app", host="127.0.0.1", port=8080, reload=True)
在这段代码中,我们创建了 FastAPI 实例并且注册了 user 的路由,现在我们通过 uvicorn.run()
方法来启动我们的程序,同时设置热启动为 True
,接下来通过命令行来启动程序,在 Bash 中输入 python main.py
,如下图表示启动成功:
测试注册
接下来让我们启动测试,看能否实现用户的注册操作,另外打开一个终端,输入下面的内容来注册用户:
css
curl -X 'POST' 'http://127.0.0.1:8080/user/signup' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{
"email": "test12345@outlook.com",
"password": "djkfhj85adGD#$4!",
"username": "demo",
"events": []
}'
如果得到如下的消息,表明注册成功:
json
{"message":"User successfully registered!"}
如果再次请求,则会得到如下错误:
服务器端也会得到如下的两条响应:
- 一条是注册成功
200 OK
- 一条是邮箱重复冲突
409 Conflict
接下来,让我们来测试登录路由功能,在终端中输入下面的 curl 命令:
vbnet
curl -X 'POST' \
'http://127.0.0.1:8080/user/signin' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"username": "demo",
"email": "test12345@outlook.com",
"password": "djkfhj85adGD#$4!"
}'
登录成功的话,会得到如下的一条返回消息:
json
{"message":"User signed in successfully!"}
截图成功如下:
服务器终端会有注册成功和登录成功的两条 200 OK
的响应码,说明程序正常运行:
但如果我们此时输入一条不一样的密码,例如:
css
curl -X 'POST' 'http://127.0.0.1:8080/user/signin' -H 'accept: application/json' -H 'Content-Type: application/json' -d '{
"username": "demo",
"email": "test12345@outlook.com",
"password": "123456"
}'
{"detail":"You input a wrong password"}
则会得到服务器 INFO: 127.0.0.1:12583 - "POST /user/signin HTTP/1.1" 403 Forbidden
的错误,同时会收到响应消息如下图:
为了更方便的看我们的接口文档,可以从 FastAPI 提供的交互式文档中查看我们的路由。让我们在浏览器中访问 http://127.0.0.1:8080/docs 访问交互式文档:
总结
此时,我们已经实现了用户的路由,接下来,让我们看看如何实现待办事项 events
的路由。这篇文章还没实现退出登录,感兴趣的读者可以自己在本地实现一下,期待你的成功,然后来评论区分享你喜悦的结果。
希望本文能对你有所帮助,如果喜欢本文,可以点个关注。
下一篇文章见!宇宙古今无有穷期,一生不过须臾,当思奋争。