python实现生成验证码的逻辑

V站笔记

 假设我们有一个fonts的文件夹,里面有1.ttf,2.ttf,3.ttf三个字体文件

具体代码实现代码codes.py:

  1. # coding:utf8
  2. from PIL import ImageDraw, ImageColor, ImageFile, ImageFont, ImageFilter, Image
  3. import random
  4. import os
  5. import uuid
  6. class Codes:
  7. # 定义随机字符
  8. def random_chr(self):
  9.         num = random.randint(1, 3)
  10. if num == 1:
  11.             char = random.randint(48, 57)
  12. elif num == 2:
  13.             char = random.randint(97, 122)
  14. else:
  15.             char = random.randint(65, 90)
  16. return chr(char)
  17. # 定义干扰字符
  18. def random_dis(self):
  19.         arr = ["~", "^", "_", "."]
  20. return arr[random.randint(0, len(arr) - 1)]
  21. # 定义干扰字符的颜色
  22. def random_color1(self):
  23. return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
  24. def random_color2(self):
  25. return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
  26. # 生成验证码
  27. def create_code(self):
  28.         width = 200
  29.         height = 60
  30. # 创建一个画布图片
  31.         image = Image.new("RGB", (width, height), (192, 192, 192))
  32. # 创建font对象,定义字体以及大小
  33.         font_name = random.randint(1, 3)
  34.         font_file = os.path.join(os.path.dirname(__file__), "fonts") + "/" + "%d.ttf" % font_name
  35.         font = ImageFont.truetype(font_file, 30)
  36. # 填充像素点
  37.         draw = ImageDraw.Draw(image)
  38. for x in range(0, width, 5):
  39. for y in range(0, height, 5):
  40.                 draw.point((x, y), fill=self.random_color1())
  41. # 填充干扰字符
  42. for v in range(0, width, 30):
  43.             dis = self.random_dis()
  44.             w = 5 + v
  45.             h = random.randint(5, 15)
  46.             draw.text((w, h), dis, font=font, fill=self.random_color1())
  47. # 填充字符
  48.         chars = ""
  49. for v in range(4):
  50.             c = self.random_chr()
  51.             chars += str(c)
  52.             h = random.randint(5, 15)
  53.             w = width / 4 * v + 10
  54.             draw.text((w, h), c, font=font, fill=self.random_color2())
  55. # 模糊效果
  56.         image = filter(ImageFilter.BLUR)
  57. # 保证图片名称的唯一性
  58.         image_name = "%s.jpg" % uuid.uuid4().hex
  59.         save_dir = os.path.join(os.path.dirname(__file__), "codes")
  60. if not os.path.exists(save_dir):
  61. os.makedirs(save_dir)
  62.         image.save(save_dir + '/' + image_name)
  63. return dict(
  64.             img_name=image_name,
  65.             code=chars
  66.         )

 应用

flask项目中

  • 在定义路由的views.py文件中引用。自定义一个"/codes/"的路由,用来GET到验证码
  1. # 验证码
  2. @app.route('/codes/', methods=["GET"])
  3. def codes():
  4. from codes import Codes
  5.     c = Codes()
  6.     info = c.create_code()
  7.     image = os.path.join(os.path.dirname(__file__), "static/code") + "/" + info["img_name"]
  8.     with open(image, "rb") as f:
  9.         image = f.read()
  10.     session["code"] = info["code"]
  11. return Response(image, mimetype="jpeg")

上面读取到图片并显示出来了,将验证码的值给到session["code"]来存储,这样访问http:xxx.xx.xx./codes/就可以获取到验证码的图片,并保存在本地code的文件夹中

  • 然后在前端页面验证码图片显示的的地方引用,点击图片会重新切换生成一个
  1. <img alt="点击切换验证码" title="点击切换" src="/codes/" onclick="this.src='/codes/?' + Math.random()"
  2. style="width: 180px; height:50px; margin-top: 6px;">
  • 在forms.py文件中存入session的code与code表单的输入的值进行对比判断
  1. # 自定义验证码验证功能
  2. def validate_code(self,field):
  3.         code = field.data
  4. # if not session.has_key("code"): python2写法
  5. if "code" not in session:
  6. raise ValidationError("没有验证码")
  7. # if session.has_key("code") and session["code"].lower() != code.lower():python2写法
  8. if "code" in session and session["code"].lower() != code.lower(): # 从views中获取session的"code"
  9. raise ValidationError("验证码错误")

原文链接:https://24bp.cn

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ios 技术积累

ios Charts MarkerView遇到的一个问题

两个问题 问题1:最大值的的时候 MarkerView 坐标有问题 ,原因就是最大值的时候,曲线已经在View的顶部了,所以MarkerView 的Y坐标还要...

2753
来自专栏申龙斌的程序人生

SeismicPro地震剖面显示程序

SeismicPro是我用C#写的一款地震剖面显示软件,可从标准SEGY地震数据体中抽取纵测线和横测线的二维剖面,并以波形、变面积和变密度等多种方式进行专业化显...

3109
来自专栏企鹅号快讯

CSS样式基础

定义 :全称为“层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式,如文字大小、颜色、字体加粗等。...

1878
来自专栏林德熙的博客

matlab 画图

本文讲如何使用 matlab 画图。 本文包括:折线图的 x轴和y轴、标题、图例 柱状图填充图案

1552
来自专栏Golang语言社区

Golang-实现图片缩放

package main import ( "fmt" "graphics" "image" "image/png" ...

3884
来自专栏邵靖的专栏

使用 plotly 绘制数据图表

不少小伙伴在开发过程中都有对模块进行压测的经历,压测结束后大家往往喜欢使用Excel处理压测数据并绘制数据可视化视图,但这样不能很方便的使用web页面进行数据展...

1.1K6
来自专栏我分享我快乐

如何将flash制作的动画存成高质量的GIF

喜欢用flash制作GIF动画的同学有个疑惑就是flash直接导出的GIF质量不高无法达到我们对动画的色彩要求,所以下面教大家如何将flash制作的动画存成...

3287
来自专栏程序员的碎碎念

GD实战开发验证码

GD GD库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或...

3806
来自专栏iOS开发攻城狮的集散地

水波进度、加载动画、文字进度

2453
来自专栏Python数据科学

Python十分钟制作属于你自己的个性logo

词云的使用相信大家已经不陌生了,使用很简单,直接调用wordcloud包就可以了。它的主要功能是根据文本词汇和词汇频率生成图片,从中可以直观的看出各个词汇所占比...

822

扫码关注云+社区