最近有小伙伴提问:能否说下web验证的原理,感觉文字描述不清楚,于是就用代码简单的演示下:此代码是需要依赖:

sanic==19.9.0Pillow==7.0.0
import randomimport stringimport uuidimport base64import platformfrom PIL import Image, ImageDraw,ImageFontfrom io import BytesIOfrom sanic import Sanicfrom sanic.response import HTTPResponse,textfrom sanic.views import HTTPMethodViewapp = Sanic()session = {}class VerifyCode:    def __init__(self, numbers:int):        """        指定:生成的数量        """        self.number = numbers    def draw_lines(self, draw, num, width, height):        """划线"""        x1 = random.randint(0, width / 2)        y1 = random.randint(0, height / 2)        x2 = random.randint(0, width)        y2 = random.randint(height / 2, height)        draw.line(((x1, y1), (x2, y2)), fill='black', width=1)    def random_color(self):        """随机颜色"""        return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))    def gene_text(self):        """生成验证码"""        return "".join(random.sample(string.ascii_letters+string.digits, self.number))    def get_verify_code(self):        """        draw.text():            文字的绘制,第一个参数指定绘制的起始点(文本的左上角所在位置),第二个参数指定文本内容,第三个参数指定文本的颜色,第四个参数指定字体(通过ImageFont类来定义)        """        code = self.gene_text()        width, height = 130, 30        im = Image.new("RGB", (width, height), "white")        # 这里指定字体的路径        sysstr = platform.system()        font = None        if sysstr == "Windows":            font = ImageFont.truetype("C:WINDOWSFontsSTXINGKA.TTF", 25)        elif sysstr == "Darwin":            font = ImageFont.truetype('/Library/Fonts/AppleMyungjo.ttf', 25)        draw = ImageDraw.Draw(im)        for item in range(self.number):            draw.text((5+random.randint(-5,5)+23*item, 5+random.randint(-5, 5)), text=code[item],                      fill=self.random_color(), font=font)            self.draw_lines(draw, self.number, width, height)        return im, codeclass SimpleView(HTTPMethodView):    body = """                                    登录                    
{error}
验证码
验证

""" async def get(self, request): return self.response(error="") async def post(self, request): uuid = request.cookies.get("uuid", "1") verfy_code = request.form.get("code", "2").lower() code = session.get(uuid, "").lower() if code == verfy_code: return text('验证码正确') return self.response(error='') def response(self, error): im, code = VerifyCode(5).get_verify_code() buf = BytesIO() im.save(buf, "jpeg") buf_str = buf.getvalue() base64_data = base64.b64encode(buf_str).decode() id = uuid.uuid1().__str__() session[id] = code body = self.body.format(base64_data=base64_data, error=error) response = HTTPResponse(body, content_type="text/html; charset=utf-8") response.cookies["uuid"] = id return responseapp.add_route(SimpleView.as_view(), '/code')if __name__ == "__main__": app.run(host="0.0.0.0", port=8000)

只是简单的实现了验证码,没有实现点击刷新,点击刷新的原理不难:异步请求+刷新接口就好了,记得更新对应的session的key里面的value

0人点赞

随笔

sql实现random sample_web验证码的简单实现相关推荐

  1. JavaScript案例之使用验证码进行简单判断

    JavaScript案例之使用验证码进行简单判断 源代码: <!DOCTYPE html> <html><head><meta charset="u ...

  2. SQL Server中的锁的简单学习

    原文:SQL Server中的锁的简单学习 简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但 ...

  3. iis开启php验证码,php结合GD库实现中文验证码的简单方法

    前言 上一次写了一个常见的验证码,现在玩一下中文的验证码,顺便升级一下写的代码 流程基本差不多 先看GD库开启了没 生成中文5位验证码 开始画图 画干扰素 生成图形 完事 生成中文验证码 //小小心机 ...

  4. 为什么使用@tablename起别名产生的sql语句不能用_10个简单步骤,完全理解SQL

    多年前收藏在笔记中的一篇文章,今天偶然翻出,重读了一遍,依然大有收获.分享出来,大家一起探讨. 以本文是为了以下读者而特地编写的: 1. 在工作中会用到 SQL 但是对它并不完全了解的人. 2. 能够 ...

  5. sql server伪列_伪简单SQL Server恢复模型

    sql server伪列 This article gives an overview of the Pseudo Simple SQL Server Recovery Model. It also ...

  6. 29 Oracle数据库SQL开发之 SQLPlus使用——创建简单报表

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 29.O ...

  7. SQL语句--CASE函数写法的简单举例,及应用

    SQL语句–CASE函数写法的简单举例,及应用 ---case函数的基本结构:case when...then...else... ----可以写也可以不写,按实际需求end [举个栗子_1] eg1 ...

  8. Sql分页查询以及top函数简单实例

    Sql分页查询以及top函数简单实例 Sql分页查询以及top函数简单实例 我们做项目时查询表格存在几百上千条数据时经常会需要用到分页,下面就给大家介绍一下在sql中查询分页的简单实例吧.首先我们要知 ...

  9. SQL注入教程——(三)简单的注入尝试

    本文将以简单的SQL注入实例来讲解SQL注入的基本思路与流程,当然本文实例只是注入的一种情况,初学者应重点理解思路,学会举一反三. GET与POST 进行SQL注入攻击,大家还需要了解两种基本的 HT ...

最新文章

  1. 使用最小堆优化Dijkstra算法
  2. Web前端JQuery面试题(三)
  3. mysql索引分析_MySQL索引分析和优化
  4. 【ABAP妙用】复制ALV之负号提前
  5. 【Linux】Linux中目录结构说明
  6. ICMP报文分析(转)
  7. reddit_Reddit如何大规模构建功能:采访其工程副总裁
  8. 视觉SLAM十四讲学习笔记-第二讲-初识SLAM
  9. 给一线讲产品·8期|VPC、子网、安全组,是什么关系?
  10. Android开发笔记(十六)秋千摇摆动画SwingAnimation
  11. 新广告法涉及的敏感词列表
  12. python与数据挖掘 上机实验_python数据挖掘实验报告1
  13. 浅谈对JAVA堆栈的理解
  14. 一文详解高功率音频放大器的设计准则与诀窍
  15. html5 倒计时跳转动画,HTML5弹性摇摆旋转的倒计时动画
  16. python爬取王者荣耀全皮肤高清无水印图片
  17. 提问的力量三:提问式思维----你是学习者还是评判者?
  18. 交警那不了了之的办事,涉案人员逃逸至今仍没归案
  19. 打开excel,提示 flash play2 错误,解决办法
  20. 百度云开放referer api接口 ,可以获取百度关键词

热门文章

  1. JAVA中0 结果_Java练习题-求1000!的结果中包含多少个0
  2. 深圳大学计算机暑期学校,The First Day-深度学习暑期学校
  3. server sql 分组 去重 字符串拼接_SQL | 数据分析面试必备SQL语句+语法
  4. python ffmpeg 视频转图片 视频转音频 播放音频 多张图片+音频转视频 多个视频合成一个视频 改变视频播放速度
  5. 创建windows窗口并且获得窗口句柄
  6. 【文本分类】混合CHI和MI的改进文本特征选择方法
  7. 行人检测--What Can Help Pedestrian Detection?
  8. 目标检测--R-FCN: Object Detection via Region-based Fully Convolutional Networks
  9. Linux内核模块编程系列1-极简内核模块编写
  10. 服务器空闲搭建什么网站,空闲的云服务器可以干什么