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

98 篇文章 1 订阅
69 篇文章 1 订阅

遗留的问题

  • 还没有测试校验的功能

测试校验验证码的功能

生成验证码

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、做存储的功能
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python私教

创业不易,请打赏支持我一点吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值