FastAPI 快速开发 Web API 项目:实现 FastAPI的用户注册和登录路由

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 的路由。这篇文章还没实现退出登录,感兴趣的读者可以自己在本地实现一下,期待你的成功,然后来评论区分享你喜悦的结果。

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

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

相关推荐
玄同7655 小时前
从 0 到 1:用 Python 开发 MCP 工具,让 AI 智能体拥有 “超能力”
开发语言·人工智能·python·agent·ai编程·mcp·trae
小瑞瑞acd5 小时前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
火车叼位6 小时前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
暮色妖娆丶6 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
火车叼位6 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
Coder_Boy_6 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
孤狼warrior6 小时前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Java后端的Ai之路6 小时前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
Katecat996636 小时前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
野犬寒鸦6 小时前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习