python 图片验证码

 

1.图片验证码第一步

# 导入绘图库
from PIL import ImageDraw, Image, ImageFont

2.生成图片验证类

 

# 图片验证类
class ImgCode(BaseHandler):

    # 定义随机颜色实例方法
    def get_random_color(self):

        R = random.randrange(255)
        G = random.randrange(255)
        B = random.randrange(255)

        return (R, G, B)

    # 生成文件流验证码
    async def get(self):
        email = self.get_argument('email', None)
        if not email:
            self.finish({"msg": '缺少唯一标识', "errcode": 0})
        # 定义画布
        img_size = (120, 50)
        # 定义画笔
        image = Image.new("RGB", img_size, self.get_random_color())
        draw = ImageDraw.Draw(image, 'RGB')

        # 绘制来源字符串
        source = "0123456789"
        # 定义容器
        code_str = ""
        # 循环绘制
        for i in range(4):
            # 获取一种颜色
            text_color = self.get_random_color()
            # 获取随机字符串
            tmp_num = random.randrange(len(source))
            random_str = source[tmp_num]
            # 收集容器中
            code_str += random_str

            # 导入系统字体
            myfont = ImageFont.truetype("C:\\windows\\fonts\\arial.ttf", 20)
            # 绘制
            draw.text((10 + 30 * i, 20), random_str, text_color)

        # 存储图片对象
        self.application.redis.set(email, code_str)

        # 获取内存缓冲区
        buf = io.BytesIO()
        # 保存图片对象
        image.save(buf, "png")
        # 设置头部声明
        self.set_header("Content-Type", "image/png")
        # 返回
        return self.write(buf.getvalue())

3.封装验证码

# 视图验证码验证
def check_imgcode(func):
    async def wrapper(self, *args, **kwargs):
        email = self.get_argument('email', None)
        image_code = self.get_argument('image_code', None)
        redis_code = self.application.redis.get(email)

        if redis_code != image_code:
            return self.finish({'msg': '验证码有误', 'errcode': 3})

        # 执行被装饰方法
        await func(self, *args, **kwargs)

    return wrapper

4.调用封装方法

@check_imgcode
    async def post(self):
        pass

5.前端获取

<van-field  v-if='isshow' v-model="img_code" placeholder="请输入验证码">
                        <template #button>
                        <van-image :src="img"  @click="getimg" class='imagecode' v-if='isshow' /> 
                        </template>
                    </van-field>
                                      
                    <br/><br/>
                    <van-button  @click="create_img">生成图片验证码</van-button> 

export default {
 data() {
    return {
     // 设置表单数据   
      
      img:this.baseurl+'imgcode/',
      img_code:'',
      isshow:0,
    }
  },
}

 

getimg:function(){
            // 生成随机数
            var num =Math.ceil(Math.random()*10)
            // 添加随机数
            this.img = this.baseurl+'imgcode/'+"?email="+this.email+'&v='+num
        },
        create_img:function(){
            if(this.email==''){
                this.$toast.fail('邮箱不能为空')
                return
            }
            if(this.isshow==0){
                // 增加邮箱参数
                this.img = this.img +'?email='+this.email
                // 展示表单和图片验证码
                this.isshow=1
            }else{
                this.getimg()
            }
            
        }

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值