UUID:
UUID 通用唯一识别码,全称(Universally Unique Identifier),是一个32位长的16进制数字,比如:
8a9069c2-bf35-40e7-9cce-ea3de3ab4e7f
UUID = 时间戳 + 设备特征码 + 随机数,UUID 产生重复数字的可能性非常非常小
图形验证码接口设计
1.1请求方式和地址
- 图形验证码接口是获取图形验证码,所以采用 GET 请求方式
- 请求参数使用路径参数,方便编码
[\w-]+
表示:匹配的字符是一个字母,这个字母可以是字母,数字,和中划线,+表示匹配一个或者多个
1.2 请求参数:路径参数
1.3 响应结果
响应结果是一个图片的byte类型数据,需要设置响应的 content-type
为 image/jpg
类型
导包
后端逻辑代码实现
1.新建应用 verification ,在项目的urls下注册应用
django-admin startapp verifications
2. 定义和配置图形验证码视图
我们这里直接使用人家帮我们可以直接生成验证码的工具包
captcha(图片验证码).zip
放在项目的libs包下
直接运行这个captcha.py文件,可以看到,输出的元组第二项:就是我们随机生成的验证码
然后我们写代码的时候,就可以使用 _, image_code, image
去接收这个输出的元组,元组第一个是未知的,第二个是验证码,第三个是图片的二进制文件格式
我们使用导入的包的正确路径是:
当我们生成了图形验证码之后,我们需要将它保存在 redis 缓存中
所以我们需要先配置redis 数据库,并且连接。
准备Redis的2号库用于存储验证码数据
配置redis数据库是在seetings里的dev文件中的CACHES中,我们只需要复制之前的已经配置好了的,将名字改一下,将数据库的编号改一下就ok
然后使用原生客户端连接上redis:
注:constants.image_code_expire是自己定义的,
redis: StrictRedis = get_redis_connection("image_code") #获取与redis的连接
redis.set(uuid, image_code, ex=constants.image_code_expire)#在redis中保存数据,ex表示有效期
image/jpg是 MIME type
import uuid
from django.http import HttpRequest, HttpResponse
from django.shortcuts import render
from django.views import View
from django_redis import get_redis_connection
from redis import StrictRedis
from woniumall.libs.captcha.captcha import captcha
from woniumall.utils import constants
class ImageCodeView(View):
def get(self, request: HttpRequest, uuid):
'''
处理图形验证码请求
'''
# 生成图形验证码
_, image_code, image = captcha.generate_captcha() # 返回元组
# 保存图形验证码
# 连接redis
redis: StrictRedis = get_redis_connection("image_code")
redis.set(uuid, image_code, ex=constants.image_code_expire)
return HttpResponse(content=image, content_type="image/jpg") #image/jpg是 MIME type