FastAPI前后端分离之登录认证案例

2,227 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 12月更文挑战」的第4天,点击查看活动详情

之前的文章中已经介绍过了python脚本自动网络巡检,但是,美中不足的是如果有新设备需要添加要修改源码,对于一些小白就比较困难了。于是就想开发一个带web页面巡检小工具

思路分析

  • 网络设备都是比较重要的设备,不能随随便便就能访问到,需要登录到管理页面上才能进行操作
  • 要有设备列表来存储要操作的设备,而且还有需要有添加和导入设备的功能。
  • 把巡检结果导出巡检报告。

基本的功能如下,后续会根据自己的需求逐步完善。

技术栈

看起来功能比较简单,但是使用到的技术还是比较多的。本案例采用前后端分离,前端采用别人写好的框架tauri-pure-admin。 后端就是采用FastAPI

Tauri-pure-admin前端

项目地址如:

https://github.com/xiaoxian521/pure-admin-thin #项目地址
https://yiming_chang.gitee.io/pure-admin-doc/  #文档地址

选择这些前端开源的项目一定要选择活跃度比较高的,这样出现了问题可以第一时间得到帮助,并在选择一些有文档的这样方便了解整个项目的设计思路

FastAPI

项目文档地址:

https://fastapi.tiangolo.com/ #文档地址

登录功能实现

用户携带用户名和密码去客户端请求应用,过程中会有用户认证服务,验证通过会返回用户一个token, 用户拿着这个token就可以取去使用他想请求的东西了。

整体的登录流程如下:

1、接收前端提交的用户名和密码之后,先查询是否用该用户。

2、如果有该用户,在进行密码校验。校验成功后,返回token。否则,登录失败。

查询用户是否存在的核心代码如下:

async def has_user(username):
    """
    通过用户名检索数据是否存在
    :param username:
    :return:
    """
    return await UserDao.select({"username": username})

密码校验密码核心代码如下:

def verify_password(plain_password: str, hashed_password: str) -> bool:
    '''
    description:  验证明文密码 vs hash密码
    :param plain_password: 明文密码
    :param hashed_password: hash密码
    :return:
    '''
    return pwd_context.verify(plain_password,hashed_password)

生成token核心代码如下:

def generate_token(username:str,expires_delta: Optional[timedelta] = None)->str:
    '''
    description: 生成Token
    return Token
    '''    
    to_encode = {"sub": username}.copy()
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
    to_encode.update(dict(exp=expire))
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

接口地址函数核心代码如下:

from fastapi import APIRouter
from schemas import common as BaseSchema
from service import auth as AuthService

router = APIRouter(tags=["认证"])

LoginResult = BaseSchema.Response[BaseSchema.LoginResult]

@router.post("/login",summary="登录",response_model=LoginResult)
async def login(data:BaseSchema.LoginForm):
    return await AuthService.user_login(data)

效果演示

如何获取项目

在WX搜索公众号"攻城狮成长日记",并回复发送“WEB”就能轻松的获取。