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