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

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

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

相关推荐
不写八个13 分钟前
Python办公自动化教程(005):Word添加段落
开发语言·python·word
_.Switch31 分钟前
Python机器学习框架介绍和入门案例:Scikit-learn、TensorFlow与Keras、PyTorch
python·机器学习·架构·tensorflow·keras·scikit-learn
赵荏苒42 分钟前
Python小白之Pandas1
开发语言·python
计算机学姐1 小时前
基于SpringBoot+Vue的高校运动会管理系统
java·vue.js·spring boot·后端·mysql·intellij-idea·mybatis
一眼万里*e1 小时前
fish-speech语音大模型本地部署
python·flask·大模型
结衣结衣.2 小时前
python中的函数介绍
java·c语言·开发语言·前端·笔记·python·学习
程序员陆通2 小时前
Spring Boot RESTful API开发教程
spring boot·后端·restful
茫茫人海一粒沙2 小时前
Python 代码编写规范
开发语言·python
林浩2332 小时前
Python——异常处理机制
python
数据分析螺丝钉2 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试