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

zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 zdppy_cache框架的低代码实现

遗留问题

  • 1、封装API
  • 2、有账号密码
  • 3、查询所有有效的具体数据,也就是缓存的所有字段

封装查询所有有效具体数据的方法

基本封装

def get_all(self, is_active=True, limit=100000):"""遍历数据库中所有的key,默认查询所有没过期的:param is_active: 是否只查没过期的:param limit: 默认10000,但是允许做限制:return: 遍历到的所有的key,没有返回空列表"""_disk_get = self._disk.getcolumns = ["key", "raw", "store_time", "expire_time", "access_time", "access_count", "tag", "size", "mode","filename", "value"]column = ",".join(columns)rows = Noneif is_active:# 查没过期的select = f'SELECT {column} FROM Cache where expire_time > ? LIMIT ?'rows = self._sql(select, (time.time(), limit)).fetchall()else:# 查所有的select = f'SELECT {column} FROM Cache  LIMIT ?'rows = self._sql(select, (limit,)).fetchall()# 处理data = []for row in rows:item = {}for i in range(len(columns)):item[columns[i]] = row[i]data.append(item)# 返回return data

基本用法

import zdppy_cache as c
import time# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)# 获取所有的缓存的key-value
print(c.get_all())time.sleep(3)
print("默认查询未过期的:", c.get_all())
print("查询过期的:", c.get_all(False))# 清空缓存
c.delete_all()

查询总缓存大小

最简单的方案

它是基于磁盘的,我们统计磁盘大小就知道了。

基本封装

def get_size():"""获取占据的内存大小但是只有在调用方法的那一刻会占据内存,平时都是存储在磁盘中的"""with Cache(cache_directory) as cache:return cache.volume()

使用示例

import zdppy_cache as c
import time# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)# 获取占据磁盘大小
print(c.get_size())# 加很多东西
for i in range(100):c.set(f"zhangsan{i}", i)print(c.get_size())# 清空缓存
c.delete_all()

有账号密码

思路?

账号密码是用来校验权限,主要是为了确定自己专属数据库。

对账号密码做sha256加密得到一个字符串作为缓存目录。如果这个目录存在,说明系统中有该用户,否则没有,新建。

python实现sha256加密

import hashlibdata = "你好"   # 要进行加密的数据
data_sha = hashlib.sha256(data.encode('utf-8')).hexdigest()   
print(data_sha)

需要key用户私钥吗?

不需要,简单点。

简单的实现

import hashlib
import shutil
import os
from .core import Cacheclass UserCache:def __init__(self, username, password, cache_dir="./tmp/.zdppy_cache"):# 构建缓存目录self.key = hashlib.sha256(f"{username}&&{password}".encode('utf-8')).hexdigest()self.cache_dir = os.path.join(cache_dir, self.key).replace("\\", "/")if not os.path.isdir(self.cache_dir):os.makedirs(self.cache_dir)self.cache = Cache(self.cache_dir)def set(self, key, value, expire=180):"""设置缓存"""self.cache.set(key, value, expire)def get(self, key):"""获取缓存"""value = self.cache.get(key)return valuedef delete_all(self):"""清空缓存"""self.cache.close()try:shutil.rmtree(self.cache_dir)except OSError:pass

使用示例

import zdppy_cache# 设置缓存
key = "code"
value = "A13k"# 设置缓存
c = zdppy_cache.UserCache("admin", "admin123456")
c.set(key, value, 3)# 获取缓存
print(c.get(key))# 让另一个用户去获取缓存
c = zdppy_cache.UserCache("admin", "admin123457")
print("另一个用户", c.get(key))# 清空缓存
c.delete_all()

封装API

基本目标

  • 1、管理员,传两个配置的key进来
    • 1、设置缓存
    • 2、获取缓存
    • 3、删除缓存
    • 4、清空缓存
    • 5、查询所有key,带查询参数:active只查激活的,value包含value默认只获取key
    • 6、当前缓存大小
    • 7、看所有数据
  • 2、普通用户,功能和管理员完全一样,但是必须要传账号密码

实现基于zdppy_api的接口缓存

基本示例:

import api
import zdppy_cachekey1 = "admin"
key2 = "admin123456"
app = api.Api(routes=[*zdppy_cache.zdppy_api.cache(key1, key2, api)]
)if __name__ == '__main__':app.run()

设置缓存:

req -X POST -d '{\"key\":1,\"value\":111}' http://127.0.0.1:8888/zdppy_cache/set

在这里插入图片描述

获取缓存:

req -d '{\"key\":1}' http://127.0.0.1:8888/zdppy_cache/get

在这里插入图片描述

想法

  • 查询总缓存大小 搞定

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 计量自动化终端上行通信规约
  • Vue3 自定义指令
  • 【网络安全】服务基础第一阶段——第二节:网络测试与用户
  • 学习记录:js算法(十三):移动零、验证回文串
  • 考研备考是选择电子学习工具无纸化学习?还是纸质版训练考感?
  • 《javaEE篇》--线程池
  • C++ 适配器 priority_queue(优先级队列)
  • Aiseesoft Mac Video Converter Ultimate:高效多能的视频转换与编辑工具
  • 【教程】Leetcode 必知必会常用函数(C 语言版)
  • C# 时间日期运算
  • HarmonyOS NEXT 地图服务中‘我的位置’功能全解析
  • 基于机器学习的二手房房价数据分析与价格预测模型
  • 上传PDF、DOC文件到SAP HCM系统中案例
  • CSS文本样式(二)
  • Day16_Zookeeper
  • [PHP内核探索]PHP中的哈希表
  • 《剑指offer》分解让复杂问题更简单
  • 30秒的PHP代码片段(1)数组 - Array
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Java比较器对数组,集合排序
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • MYSQL 的 IF 函数
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • session共享问题解决方案
  • TypeScript迭代器
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue UI框架库开发介绍
  • Vue.js源码(2):初探List Rendering
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 基于axios的vue插件,让http请求更简单
  • 记录:CentOS7.2配置LNMP环境记录
  • 如何进阶一名有竞争力的程序员?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用权重正则化较少模型过拟合
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 微信开源mars源码分析1—上层samples分析
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一些关于Rust在2019年的思考
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (C语言)共用体union的用法举例
  • (javascript)再说document.body.scrollTop的使用问题
  • (JS基础)String 类型
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (TOJ2804)Even? Odd?
  • (十)T检验-第一部分
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (万字长文)Spring的核心知识尽揽其中
  • (原创) cocos2dx使用Curl连接网络(客户端)