图片验证码
- 配置图片包
- 生成图片验证码
- 发送图片验证码
- 效验图片验证码
- 前端图片验证码配置
1. syl/settings.py中配置缓存
# 缓存配置
CACHES = {
# django存缓默认位置,redis 0号库
# default: 连接名称
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
# django session存 reidis 1 号库(现在基本不需要使用)
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
# 图形验证码,存redis 2号库
"img_code": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# 配置session使用redis存储
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 配置session存储的位置: 使用cache中的 session配置
SESSION_CACHE_ALIAS = "session"
2.在verifications/views.py中使用
from django.http import HttpResponse, HttpResponseForbidden
from django.views import View
from django_redis import get_redis_connection
from libs.captcha.captcha import captcha
class ImageCodeView(View):
def get(self, request):
# 1.接收数据(uuid)
uuid = request.GET.get('uuid')
# 2.校验数据
if not uuid:
return HttpResponseForbidden('uuid无效')
# 3.处理业务
# 获取图片文本内容和图片二进制代码
text, image = captcha.generate_captcha() # text=GPMZ; image=图片
# 4.把uuid和图片文本存入redis
redis_client = get_redis_connection('img_code') # 获取redis客户端
# 5.写入redis(是字符串)
redis_client.setex(uuid, 60 * 5, text)
# 6.返回响应图片
return HttpResponse(image, content_type='image/jpg')
3.使用图片验证码登录views.py
class Login(Resource):
"""登录
手机号/用户名登录
1.获取数据:账号的唯一识别信息
2.获取对应的账号信息3l
3.验证密码是否正确
密码
"""
def post(self):
parse = reqparse.RequestParser()
parse.add_argument('uuid')
# 这个是前段的输入图片验证数字
parse.add_argument('img_code')
args = parse.parse_args()
uuid = args.get('uuid')
img_code = args.get('img_code')
# 存入redis
res = redis.Redis()
# 这个UUID 是存入redis数据库的 get(uuid)取出
real_code = res.get(uuid)
if not real_code:
return {'code': 407, 'message': '验证码过期'}
# 将decode() 的redis字符串解码
real_code = real_code.decode()
# lower转换字符串中所有大写字符为小写
real_code = real_code.lower()
code = img_code.lower()
# redis中得到的跟前端传过来的是否一样
if real_code != code:
return {'code': 406, 'message': '验证码错误'}



