zdppy+vue3+onlyoffice文档管理系统实战 20240829上课笔记 Python验证码框架完成

news2024/9/22 17:23:52

遗留的问题

  • 还没有测试校验的功能

测试校验验证码的功能

生成验证码

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),
    ]

在API接口中使用

import zdppy_api as api
import zdppy_captcha
import zdppy_cache

cache = zdppy_cache.Cache("tmp/.captcha_cache")
app = api.Api(
    routes=[
        *zdppy_captcha.zdppy_api.captcha(api, cache),
    ]
)

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/zdppy_captcha")
print(resp.json())
print(resp.json().get("data").get("img"))

校验验证码

import req

resp = req.post("http://127.0.0.1:8888/zdppy_captcha", json={"key": "919bdbde658f4b178d08bb580557fbf5", "code": "ihbn"})
print(resp.json())
print(resp.json().get("data").get("img"))

将验证码的功能整合到登录界面里

当前的登录界面

在这里插入图片描述

当前的后代代码

import json
import req
import zdppy_api as api
import zdppy_env as env
import zdppy_mcrud as mcrud
import routes
import zdppy_amauth as amauth

from zdppy_api import PlainTextResponse

env.load(".env")

db = mcrud.new_env()


async def doc_callback(request):
    data = await api.req.get_json(request)
    print("callback === ", data)
    # status == 2 文档准备好被保存
    if data.get("status") == 2:
        req.download(data.get("url"), "data/test.docx")
    if data.get("status") == 6:
        req.download(data.get("url"), "data/test.docx")
    # status == 6 文档编辑会话关闭
    data = {"error": 0}
    # return JSONResponse('{"error":0}')
    # return JSONResponse(json.dumps(data))
    return PlainTextResponse(json.dumps(data))


app = api.Api(
    routes=[
        api.resp.dir_route("/dist", "data"),
        api.resp.post("/callback", doc_callback),
        *routes.get_file_routes(db),
        *amauth.routers.get_all_routers(db),
    ],
    middleware=[api.middleware.cors()],
)

if __name__ == "__main__":
    import zdppy_uvicorn

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

大部分的功能都集中在main.py中,不利于代码的管理,所以我们需要进行拆分。

封装一个get_routes方法

from .file import get_file_routes


def get_routes(db):
    """初始化路由"""
    routes = []
    routes.extend(get_file_routes(db))  # 文件相关的表
    return routes

封装文档相关的路由

import zdppy_api as api
import req
import json
from zdppy_api import PlainTextResponse


async def doc_callback(request):
    data = await api.req.get_json(request)
    print("callback === ", data)
    # status == 2 文档准备好被保存
    if data.get("status") == 2:
        req.download(data.get("url"), "data/test.docx")
    if data.get("status") == 6:
        req.download(data.get("url"), "data/test.docx")
    # status == 6 文档编辑会话关闭
    data = {"error": 0}
    # return JSONResponse('{"error":0}')
    # return JSONResponse(json.dumps(data))
    return PlainTextResponse(json.dumps(data))


def get_doc_routes():
    """获取文档相关的路由"""
    return [
        api.resp.post("/callback", doc_callback),
    ]

封装权限相关的路由

import zdppy_amauth as amauth

from .file import get_file_routes
from .doc import get_doc_routes


def get_routes(db):
    """初始化路由"""
    routes = []
    routes.extend(get_file_routes(db))  # 文件相关的路由
    routes.extend(get_doc_routes())  # 文档相关的路由
    routes.extend(amauth.routers.get_all_routers(db))  # 权限相关的路由
    return routes

最终,我们得到比较干净的入口代码

import zdppy_api as api
import zdppy_env as env
import zdppy_mcrud as mcrud
import routes

env.load(".env")

db = mcrud.new_env()

app = api.Api(
    routes=[
        *routes.get_routes(db),
    ],
    middleware=[api.middleware.cors()],
)

if __name__ == "__main__":
    import zdppy_uvicorn

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

遗留的问题

  • 1、验证码整合
  • 2、做存储的功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【cocos creator】养成游戏简易事件系统,每日随机事件,每日行动点重置,根据数据检测多结局

const { ccclass, property } cc._decorator;let actionEvent {EVENT1: { name: "工作", need: { ap: 1 }, cost: { ap: 1 }, award: { coin: 50 }, count: 7, max_count: 5 },EVENT2: { name: "练功", need: { ap: 1 }, cost: { ap: 1 }, award: { atta…

渲染农场的收费会受到哪些因素的影响?

我们使用渲染农场时,其实渲染农场的单价并不是最终的单价,因为渲染农场的收费受到很多因素的影响,影响渲染农场收费标准的因素主要包括以下几个方面: 渲染类型 GPU渲染与CPU渲染:通常,GPU渲染由于其高性…

Zookeeper官网Java示例代码解读(一)

2024-08-22 1. 基本信息 官网地址: https://zookeeper.apache.org/doc/r3.8.4/javaExample.html 示例设计思路 Conventionally, ZooKeeper applications are broken into two units, one which maintains the connection, and the other which monitors data. I…

昇思AI框架实践2:基于T5的SQL语句生成模型推理

MindSpore 基于T5的SQL语句生成项目实施 基于T5的SQL语句生成项目介绍 本项目旨在开发一个基于T5-small模型的自然语言转SQL语句生成器。该生成器能够将用户以自然语言形式提出的查询请求转换为对应的SQL查询语句,从而使得即使是不熟悉SQL语言的用户也能够轻松地从…

【Java EE】JVM

目录 1. JVM简介 2.JVM运行流程 3.JVM运行时数据区 3.1 堆(线程共享) 3.2 Java虚拟机栈(线程私有) 1. JVM简介 JVM是 Java Virtual Machine 的简称,意为Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的…

马克·古尔曼:预计苹果新款Macs要到10月才会发布

马克古尔曼当地时间8月24日在社交媒体平台推特平台发文称,从以往模式来看,预计苹果公司新款Mac要到10月才会发布。 古尔曼称,预计Mac mini将是今年最值得关注的、配置M4芯片的Mac,但预计苹果还会发布新款MacBook Pro。他表示&…

【Qt】网格布局管理器QGridLayout

网格布局管理器QGridLayout Qt中提供QGridLayout用来实现网格布局的效果。 核心属性 整体和 QVBoxLayout 以及 QHBoxLayout 相似. 但是设置 spacing 的时候是按照垂直⽔平两个 ⽅向来设置的. 属性说明 layoutLeftMargin 左侧边距 layoutRightMargin 右侧边距 layoutTo…

类与Object.create之间的继承

前言 ● 下面是一段之前学习Object.create的一段代码 const PersonProto {calcAge() {console.log(2037 - this.birthYear);},init(firstName, birthYear) {this.firstName firstName;this.birthYear birthYear;} };const zhangsan Object.create(PersonProto); ● 和之前…

day-43 括号生成

思路 通过深度优先遍历,把所有可能的组合枚举出来,然后依次判断是否符合括号规则,符合则加入链表 解题过程 判断是否括号规则:第一个位置只能是(,维护一个val值(初始值为0),遍历字符串,每当加入…

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习(Deep Reinforcement Learning, DRL)结合了深度学习和强化学习的优点,能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数,从而提高学习能力和决策效率…

【项目日记】高并发内存池---实现线程缓存

比起那些用大嗓门企图压制世界的人, 让全世界都安静下来听你小声说话的人更可畏。 --- 韩寒 《告白与告别》--- 高并发内存池项目---实现线程缓存 1 框架设计2 自由链表类和哈希规则2.1 自由链表类2.2 映射规则 3 实现线程缓存3.1 申请内存3.2 释放内存 4 多线程…

day-43 盛最多水的容器

思路 双指针:首先令i0,jheight.length-1,选取短板(即Math.min(height[i],height[j])),然后将短板向内移动,直达i>j即可得到答案。 解题过程 短板向内移动:水的容量可能增大 长板向内移动:水的容量不可能…

树莓派5安装系统并配置SSH与VNC权限实现Windows设备远程连接

文章目录 前言1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS2. Windows安装VNC远程树莓派3. 使用VNC Viewer公网远程访问树莓派3.1 安装Cpolar步骤3.2 配置固定的公网地址3.3 VNC远程连接测试 4. 固定远程连接公网地址4.1 固定TCP地址测试 前言 本文主要介绍如何在树莓派…

数字化转型升级探索(一)

在数字化转型升级的探索中,我们将通过实施综合数字化战略,涵盖从前端用户体验优化到后端系统集成的全方位提升,利用大数据、人工智能、云计算等先进技术对业务流程进行智能化改造,推进自动化和数据驱动决策,推动业务模…

VMware安装Ubuntu 23.10.1系统图文版

文章目录 Ubuntu系统介绍引言Ubuntu系统的特点1. 开源免费2. 易用性3. 稳定性与安全性4. 强大的社区支持 安装与初步设置下载ISO镜像安装1.新建虚拟机2.选择“自定义(高级)”,并点击【下一步】3.选择虚拟机硬件兼容性(默认就好),并点击【下一步】4.选择“…

爆改yolov8|利用BSAM改进YOLOv8,高效涨点

1,本文介绍 BSAM基于CBAM进行改进,经实测在多个数据集上都有涨点。 BSAM(BiLevel Spatial Attention Module)是一个用于提升深度学习模型在空间特征处理中的能力的模块。它主要通过双层注意力机制来增强模型对重要空间信息的关注…

一款支持固定区域,固定尺寸大小重复截图的软件

WinSnap是一款功能强大的屏幕截图软件,可以实现对固定区域,固定尺寸大小区域重复截图,适用于日常截图需求和专业用户进行屏幕截图和图像编辑。通过设置快捷键,方便快速重复截图固定区域固定大小。它支持捕捉整个屏幕、活动窗口、选…

H264码流结构讲解

所谓的码流结构就是指:视频经过编码之后所得到的数据是怎样排列的,换句话说,就是编码后的码流我们该如何将一帧一帧的数据分离开来,哪一块数据是一帧图像,哪一块是另外一帧图像,只要了解了这个,…

UE开发中的设计模式(四) —— 组合模式

面试中被面试官问到组合模式和继承有什么区别&#xff0c;给我问懵了&#xff0c;今天又仔细看了下&#xff0c;这不就是UE里的组件吗 >_< 文章目录 问题提出概述问题解决总结组合模式的优缺点继承的优缺点 问题提出 考虑这样一个场景&#xff0c;我们有一个敌人的基类&…