图形验证码的借口定义
接下来我们要用代码实现上述功能,我们要养成写注释的好习惯
首先我们要生成验证码,直接调用我们写好的生成图片验证码的库
from lghome.utils.captcha.captcha import captcha
我们之前讲过,这个方法会生成两个值,一个是验证码,一个是图片
所以我们赋值两个值,text就是验证码的文本信息,image_data就是图片数据
from . import api
from lghome.utils.captcha.captcha import captcha
@api.route("/image_codes/<image_code_id>")
def get_image_code(image_code_id):
"""
获取图片验证码
:param image_code_id:图片的编号
:return:验证码,验证码图像
"""
# 验证参数
# 业务逻辑处理
# 生成验证码图片
text,image_data = captcha.generate_captcha()
接下来我们需要保存验证码并设置过期时间
@api.route("/image_codes/<image_code_id>")
def get_image_code(image_code_id):
"""
获取图片验证码
:param image_code_id:图片的编号
:return:验证码,验证码图像
"""
# 验证参数
# 业务逻辑处理
# 生成验证码图片
text,image_data = captcha.generate_captcha()
# 保存验证码到Redis
redis_store.setex('image_code_%s'% image_code_id,60,text)
setex这个方法不一定会成功,如果出现异常,我们要捕捉线上的错误日志,我们要倒入logging库
如果我们保存失败了,我们就不需要他继续往下了,所以我们直接return,返回的是什么呢,是json的字符串
倒入jsonify库,这里需要与前端沟通,询问需要返回什么,这里我们可以直接去看我们的js文件中的数据
text,image_data = captcha.generate_captcha()
# 保存验证码到Redis
try:
redis_store.setex('image_code_%s'% image_code_id,60,text)
except Exception as e:
logging.error(e)
return jsonify(errno=400,errmsg='保存图片验证码失败')
下面这个60秒还有400的errno是不是有可能在其他地方也用到,可能出现的重复代码,我们不需要重复写,我们定义一个文件来存放我们的重复代码
我们创建一个存放常量的文件constans.py文件
#图片验证码的有效期,单位秒
IMAGE_CODE_REDIS_EXPIRES = 180
导入库
from lghome import constans
然后修改verify_code.py文件
然后是我们的状态码,但是一般我们的状态码都有一个单独存放的文件,这里我们直接复制进来
以为这两个文件与业务逻辑没有关系,所以我们放到lghome目录下
导入库
from lghome.response_code import RET
修改verify_code.py文件
如果上面的程序没有出错,已经把验证码保存到redis中了,接下来我们就应该返回图片了
但是我们这样直接return iamge_data浏览器不认识鸭,我们打开浏览器观察一下
我们随便点一张图片查看他的Headers
我们在看一下不是图片的,普通的文件的Headers
他不是图片类型,所以如果我们不修改的话浏览器就是不认识他的
所以我们不能直接返回
我们需要使用make_response
导入库
from flask import jsonify,make_response
修改herders中的Content-type值
#返回值
response = make_response(image_data)
response.headers['Content-Type'] = 'image/jpg'
return response
最后别忘了在我们的蓝图文件下注册路由
否则是访问不到路由的
访问网址
显示出了我们的图形验证码
我们可以在cmd中查看我们的Redis
首先需要进入到我们的redis的文件夹中
通过命令启动,然后就可以查看redis了
我们刷新网页得到了新的验证码。获取一下他的值
成功
再试一下,成功