当前位置: 首页 > article >正文

zdppy+vue3+onlyoffice文档管理系统实战 20240828上课笔记 zdppy_cache框架完成和验证码框架继续优化

接下来

  • 1、继续开发验证码框架
  • 2、要将验证码进行缓存
  • 3、要实现验证码的校验

回顾验证码的使用

开发服务器端

import zdppy_api as api
import zdppy_captcha

app = api.Api(
    routes=[
        api.resp.get("/captcha", zdppy_captcha.zdppy_api.get(api.resp.success))
    ]
)

if __name__ == '__main__':
    import zdppy_uvicorn

    zdppy_uvicorn.run(app, host="0.0.0.0", port=8888)

开发客户端

import req

resp = req.get("http://127.0.0.1:8888/captcha")
print(resp.json())
print(resp.json().get("data").get("img"))

验证码框架的问题

  • 1、没有校验的接口
  • 2、需要先实现校验的方法

封装判断验证码是否正确的方法

方法的基本封装


def is_captcha(cache_obj, user_key, user_captcha):
    """
    校验验证码是否正确
    :param cache_obj: 这是一个缓存对象,必须有 get 方法,且通过get方法能够获取到真实的验证码
    :param user_key: 验证码的唯一key,用来确保用户输入的验证码的唯一性
    :param user_captcha: 用户输入的验证码,用来校验cache_obj中存储的验证码是否和用户的验证码一致
    """
    # 获取验证码
    cache_captcha = None
    try:
        cache_captcha = cache_obj.get(user_key)
    except:
        return False

    # 验证码不是字符串类型
    if not isinstance(cache_captcha, str):
        return False

    # 比较验证码
    return cache_captcha.lower() == str(user_captcha).lower()

简单的测试

这里使用zdppy_cache存储验证码,并进行校验。

import zdppy_captcha as captcha
import zdppy_cache as cache

# 系统的验证码
key, code, img = captcha.get_base64(4)
print(key)
print(code)
print(img)

# cache_obj 只有有set方法就行
# 存储验证码
cache_obj = cache.Cache("tmp/.zdppy_captcha")
cache_obj.set(key, code)

# 用户的验证码
user_key = key
user_captcha = code
user_captcha2 = code * 2

# 校验
v1 = captcha.is_captcha(cache_obj, user_key, user_captcha)
print(v1, v1 == True)

v2 = captcha.is_captcha(cache_obj, user_key, user_captcha2)
print(v2, v2 == False)

设置验证码的过期时间

import zdppy_captcha as captcha
import zdppy_cache as cache
import time

# 系统的验证码
key, code, img = captcha.get_base64(4)
print(key)
print(code)
print(img)

# cache_obj 只有有set方法就行
# 存储验证码
cache_obj = cache.Cache("tmp/.zdppy_captcha")
cache_obj.set(key, code, 3)

# 用户的验证码
user_key = key
user_captcha = code
user_captcha2 = code * 2

# 校验
v1 = captcha.is_captcha(cache_obj, user_key, user_captcha)
print(v1, v1 == True)

v2 = captcha.is_captcha(cache_obj, user_key, user_captcha2)
print(v2, v2 == False)

# 过期之后再校验
time.sleep(3)
v1 = captcha.is_captcha(cache_obj, user_key, user_captcha)
print(v1, v1 == False)

封装成方法

改造获取验证码的接口

from .tobase64 import get_base64


def captcha(api, num=4):
    async def get_captcha(req):
        """
        获取zdppy_api生成验证码的接口
        :param num: 验证码的个数
        :param success: api.resp.success 是zdppy_api框架中统一返回成功结果的方法
        :return:
        """
        key, code, img = get_base64(num)
        return api.resp.success({
            "key": key,
            "img": img,
        })

    return [
        api.resp.get("/zdppy_captcha", get_captcha)
    ]

封装校验的方法

from .tobase64 import get_base64
from .validate import is_captcha


def captcha(api, cache, num=4, expire=60):
    """
    :param cache: 缓存对象
    :param num: 验证码的个数
    :param expire: 验证码的过期时间,默认1分钟
    """

    async def get_captcha(req):
        """
        获取zdppy_api生成验证码的接口
        :param success: api.resp.success 是zdppy_api框架中统一返回成功结果的方法
        :return:
        """
        key, code, img = get_base64(num)
        try:
            cache.set(key, code, expire)
            return api.resp.success({
                "key": key,
                "img": img,
            })
        except Exception as e:
            pass
            return api.resp.error_500(str(e))

    async def validate(req):
        """
        校验验证码
        """
        # 用户的验证码
        data = await api.req.get_json(req)
        key = data.get("key")
        code = data.get("code")
        if not key or not code:
            return api.resp.error_400("key或者code不能为空")

        # 校验
        v1 = is_captcha(cache, key, code)
        return api.resp.success({"key": key, "code": code, "ok": v1})

    return [
        api.resp.get("/zdppy_captcha", get_captcha),
        api.resp.post("/zdppy_captcha", validate),
    ]


http://www.kler.cn/news/285170.html

相关文章:

  • EmguCV学习笔记 VB.Net 第8章 图像分割
  • org.apache.commons.lang.math.NumberUtils#isNumber 解释
  • 大语言模型数据增强与模型蒸馏解决方案
  • 【最新华为OD机试E卷】空栈压数(200分)-多语言题解-(Python/C/JavaScript/Java/Cpp)
  • 【测试】——开发模型与测试模型
  • 黑神话 悟空 配置 Mac玩游戏
  • vue3中ref绑定的节点顺序错乱
  • day36
  • 【MySQL 12】事务管理 (带思维导图)
  • leetcode 147.对链表进行插入排序
  • Pr:代理预设
  • [E二叉树] lc110. 平衡二叉树(dfs+自底向上)
  • Java技术栈 —— Spark入门(二)之实时WordCount
  • 基于微信小程序的电动车租赁系统---附源码97332
  • 遇到的BUG及解决方法
  • 【读书笔记-《30天自制操作系统》-12】Day13
  • 监控平台之上报(未完成)
  • Python算法工程师面试整理-Python 编程技巧
  • 使用Ansible stat模块检查目录是否存在
  • 【Docker】Dockerfile实列-Nginx镜像构建
  • 类与ES6类之间的继承
  • 叶斯神经网络(BNN)在训练过程中损失函数不收敛或跳动剧烈可能是由多种因素
  • 全网最适合入门的面向对象编程教程:42 Python常用复合数据类型-collections容器数据类型
  • P02-Java流程控制基本结构
  • codetest
  • Linux下递归设置目标目录及其子目录和文件的权限
  • Qt/C++地址转坐标/坐标转地址/逆地址解析/支持百度高德腾讯和天地图
  • 项目策划书六度自由双足机器人
  • WHAT - 通过 react-use 源码学习 React(Animations 篇)
  • Qt QTableWidget可编辑设置,设置部分可编辑