新闻详情——图片验证码逻辑处理

等我们点开网页,右上角有一个登录与注册,点开注册

每次打开都会发送一个新的图片验证码,但是现在点开只会发送一个默认的图片验证码

我们先来处理这一个逻辑问题

1.图片逻辑处理问题

我们注册其实就是浏览器和服务器之间的传递,打开注册的时候,会像服务器发送一个请求,请求什么了。

请求一个图片验证码(验证码分为文字和图片),服务器接收到请求之后会生产一个图片验证码,在返回图片,让浏览器渲染。到这一步我们对一开始要求点开注册会出现新的验证码已经结束了。

但还是有一点小瑕疵

图片验证码处理完之后,手机验证码又来了,当你获取手机验证码时要满足几个条件,必须要有手机号和图片验证码才能获取手机验证码。

向服务器发送手机号和图片验证码,但是我们上面并没有存储图片验证码,所以并不知道,这就是我们说的小瑕疵了。

这个时候把图片验证码的文字版存在redis里面,在从redis中获取图片验证码,来校验。一般redis都是键值,那么我们用什么方式来获取键好了。

在redis里都是用的get获取键的,但是这里我们有一个更好的选择,那就是UUID。UUID可以细分每一个信息,给它独立的乱码来区分。

当然了,这个UUID是在浏览器中生成的,发送图片验证码请求的时候一并发送过去的。

在下次请求发送短信,把手机号和图片验证码带到服务器时,顺带一个UUID,可以用这个UUID来取redis中存储的文字验证码来校验图片验证码是否正确。

好了,这里我们的逻辑就处理完成了!

2.验证模块处理

我们先把前段的内容写一下,点开templates下的index,找到注册表单,点开第二个红框

 

 进入之后,看红框,这个意思是存储图片验证码,相当于做了一个全局的,因为我们后面还要发送短信验证码,还要把图片验证码给人家,声明了一个全局,好获取一些。

在下面的字典中写入代码:

    //生成UUID
    imageCodeId = generateUUID()
    //构造一个url地址
    var url = ""

上面的imageCodeId = generateUUID()后面的代码是个函数,它是干什么的,是生成UUID的。

为什么下面不写了,是因为我们不知道它的路由和视图函数,我们在info下的modules目录下,新建一个passport文件夹,再在里面建一个views.py文件

和之前写蓝图一样,只是views.py的蓝图实例化,名字用当前文件夹的名字

 写好之后,你的app不知道做了这步操作,在info>init中导入蓝图,还是导入我们之前导入蓝图的下面,毕竟是后面写的,免得报什么错误

 我们运行之后,会出现我们的路由的名字,为了保证路由不会和其他的路由一样,我们要加一个前缀。

 在你的passport>init中写入:

from flask import Blueprint

passport_blue = Blueprint("passport",__name__,url_prefix="/passport")

from . import views

记住:

前缀名前面一定要加斜杠,不然会报错。

但是写入前缀名之后,你的路由可以不用加入斜杠,但是为了美观我们还是加上。

 来把刚刚空下的代码补全:

 上面我们完成了路由和视图函数。那么我们就直接把路由复制到里面

 

function generateImageCode() {
    //生成UUID
    imageCodeId = generateUUID()
    //构造一个url地址
    var url = "/passport/image_code"
}

现在UUID需要和图片验证码一起发送过去,可以仿造get请求发送过去

get写法是一个问号加上一些键值段的形式。

在路由后面加上一个问号,在把imageCodeId=作为一个键写进去,再在后面用加号拼接一下UUID

function generateImageCode() {
    //生成UUID
    imageCodeId = generateUUID()
    //构造一个url地址
    var url = "/passport/image_code?imageCodId="+imageCodeId
}

看下面的红框img src后面是存储路径,但是这里把存储路径写死了,我们要修改一下,把第一个红框删了

 

在刚刚的代码中写入

function generateImageCode() {
    //生成UUID
    imageCodeId = generateUUID();
    //构造一个url地址;
    var url = "/passport/image_code?imageCodId="+imageCodeId;
    //动态修改src
    $(".get_pic_code").attr("src",url)
}

这里用的是js写法,$是过滤器的意思,因为我们要找到img,点代表着class属性,class属性不就是后面写出来的get_pic_code吗

attr是修改相关内容属性的,你要修改src,那么就写进去,在把咱们写好的url写进去就完成了

但是你想知道你到底运行有没有作用,那么我们在刚刚写的views文件中写代码

info>modules>passport>views

先导入一个request包

from flask import request

在你的是视图函数下写入

@passport_blue.route("/image_code")
def image_code():
    print(request.url)
    #随便返回一个值
    return "111"

写好之后,运行之后点击注册在点图片验证码。

回pycharm往下拉

 前面就是你写的路由地址,中间是键,后面是UUID

3.图片验证码后台逻辑

这里前段已经写得差不多了,我们来写后端的。

大家在写的时候,一定要写注释,一步一步写,才能明白

#   1.接收请求(UUID)
    imageCodeUUID = request.args.get("imageCodId")
    #   2.校验UUID(判断是否为空)
    if not imageCodeUUID:
        abort(403)
        #   3.生成图片验证码
    name, text, image = captcha.generate_captcha()
    #   4.将文字版存储在redis中
    try:
        redis_store.set("image_code:" + imageCodeUUID, text)
    except Exception as e:
        current_app.logger.error(e)  # 使用日志来记录日志信息
        abort(500)
        #   5.返回图片
    response = make_response(image)
    response.headers["Content-Type"] = "image/jpg"
    return response
原文地址:https://www.cnblogs.com/Moodsfeelings/p/13775903.html