flask爱家租房项目开发(二)

目录

图片验证码

图片验证码的使用流程

图片验证码后端接口编写


图片验证码

图片验证码的使用流程

本项目使用图片验证码的地方为注册模块中

简单的流程为:

浏览器向服务器发起请求,服务器获取验证码图片与真实值保存到redis中,并将验证码图片返回给浏览器,当获取短信验证码时进行验证码的验证,如果正确,则发送短信验证码。

如果多个用户发送验证码呢?要去怎么找验证码?怎么验证?

这个时候,在发送短信验证码的同时携带图片验证码的参数:

  • 用户填写的图片验证码
  • 图片验证码的编号

那么图片验证码的编号就应该是浏览器在发起图片验证码请求时就创建好了编号,一起发送过去,服务器生成图片验证码,将验证码的真实值以及编号一同保存到redis中,当发起短信验证码验证时,服务器就可以在redis中取出编号所对应的的图片验证码的真实值进行比较。流程更新为:

图片验证码后端接口编写

采用RESTful API风格

将captcha(别人写好的生成验证码的工具)包放到utils目录下

将response_code.py(自定义的状态码与返回值)放到utils目录下

class RET:
    OK                  = "0"
    DBERR               = "4001"
    NODATA              = "4002"
    DATAEXIST           = "4003"
    DATAERR             = "4004"
    SESSIONERR          = "4101"
    LOGINERR            = "4102"
    PARAMERR            = "4103"
    USERERR             = "4104"
    ROLEERR             = "4105"
    PWDERR              = "4106"
    REQERR              = "4201"
    IPERR               = "4202"
    THIRDERR            = "4301"
    IOERR               = "4302"
    SERVERERR           = "4500"
    UNKOWNERR           = "4501"

error_map = {
    RET.OK                    : u"成功",
    RET.DBERR                 : u"数据库查询错误",
    RET.NODATA                : u"无数据",
    RET.DATAEXIST             : u"数据已存在",
    RET.DATAERR               : u"数据错误",
    RET.SESSIONERR            : u"用户未登录",
    RET.LOGINERR              : u"用户登录失败",
    RET.PARAMERR              : u"参数错误",
    RET.USERERR               : u"用户不存在或未激活",
    RET.ROLEERR               : u"用户身份错误",
    RET.PWDERR                : u"密码错误",
    RET.REQERR                : u"非法请求或请求次数受限",
    RET.IPERR                 : u"IP受限",
    RET.THIRDERR              : u"第三方系统错误",
    RET.IOERR                 : u"文件读写错误",
    RET.SERVERERR             : u"内部错误",
    RET.UNKOWNERR             : u"未知错误",
}

将constants.py放到ihome目录下,定义一些常用的常量

# 图片验证码redis中的有效期,单位:秒
IMAGE_CODE_REDIS_EXPIRES = 180

在api_1_0目录下创建一个验证码的verify_code.py文件,管理图片以及短信验证码

pip install pillow
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import current_app, jsonify, make_response

from . import api
from ihome.utils.captcha.captcha import captcha
from ihome import redis_store
from ihome.utils.response_code import RET


# GET 127.0.0.1:5000/image_codes/<image_code_id>

@api.route('/image_codes/<image_code_id>')
def get_image_code(image_code_id):
    """
    获取验证码图片
    :param image_code_id: 图片验证码编号
    :return: 如果出现异常,返回异常信息,否则,返回验证码图片
    """
    # 生成验证码图片
    # 名字,真是文本,图片数据
    name, text, image_code = captcha.generate_captcha()

    # 将编号以及验证码的真实值保存到redis(选择字符串)中,并设置有效期(自定义有效期为180秒,设置成了常量,在constants中)
    # redis_store.set('iamge_code_%s' % image_code_id, text)
    # redis_store.expire('image_code_%s' % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES)
    # 将以上合并写
    try:
        redis_store.setex('image_code_%s' % image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
    except Exception as e:
        # 记录日志
        current_app.logger.error(e)
        # return jsonify(errno=RET.DBERR, errmsg="save image code failed")
        # 出现异常,返回json格式的提示
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")

    # 没有异常 返回验证码图片,并指定一下Content-Type(默认为test/html)类型为image,不改不认识图片
    resp = make_response(image_code)
    resp.headers['Content-Type'] = 'image/jpg'
    return resp

在api目录下的init.py文件中导入verify_code

from . import demo, verify_code

启动项目,浏览器输入 "127.0.0.1:5000/api/v1.0/image_codes/123" ,其中123是任意写的编号,这里只是测试用的

redis数据库中:

注意:captcha这个文件是基于python2.7写的,当前是python3.7,所以直接拿过来是不行的,需要改一些地方

1. xrange在python3.x版本中取消了,代替的是range,但是range返回的是列表,而xrange返回的是一个生成器,因此,为了尽可能少的改动原来的代码,我自定义写了一个xrange,直接import过来即可

2. 在python2.7版本中的string下的uppercare和lowercase已经在python3.x版本中改掉了,在这里需要手动改一下,ascii_uppercare,ascii_lowercase

3. cStringIO在python3.x版本中也取消了,可以用 io 模块下的 BytesIO 代替

第9行     from io improt BytesIO

第16行    from ihome.utils.commons import xrange

第73、210行     string.uppercase  ---->   string.ascii_uppercase
               string.lowercase  ---->   string.ascii_lowercase

第212行   out = BytesIO()
# ihome/utils/commons.py

# 正则转换器
class ReConverter(BaseConverter):
    ...

# xrange
def xrange(start, end=None, step=1):
    if end == None:
        end = start
        start = 0
    if step > 0:
        while start < end:
            yield start
            start += step
    elif step < 0:
        while start > end:
            yield start
            start += step
    else:
        return 'step can not be zero'

设置一下前端的图片验证码,使其正常加载

在浏览器访问register.html注册页面时,应自动发送图片验证码的请求,其次,点击验证码图片则再次发起请求

在register.js文件中完成该项功能:

// 保存图片验证码编号
var imageCodeId = "";

function generateImageCode() {
    // 形成图片验证码的后端地址, 设置到页面中,让浏览请求验证码图片
    // 1. 生成图片验证码编号
    imageCodeId = generateUUID();
    // 设置图片url
    var url = "/api/v1.0/image_codes/" + imageCodeId;
    $(".image-code img").attr("src", url);
}

..

$(document).ready(function() {
    generateImageCode();
    $("#mobile").focus(function(){
        $("#mobile-err").hide();
    });
    $("#imagecode").focus(function(){
        $("#image-code-err").hide();
    });
    ....
});

清除一下浏览器的缓存,并访问注册页面 "127.0.0.1:5000/register.html"

验证在下一节中提及

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值