python中使用PIL制作并验证图片验证码


Posted in Python onMarch 15, 2018

验证码制作

#string模块自带数字、字母、特殊字符变量集合,不需要我们手写集合
import string
import random
import os
import uuid

import settings
from PIL import Image, ImageDraw, ImageColor, ImageFilter, ImageFont


class Code(object):
 # 生成随机生成数字或字母
 def random_hexdigits(self, len=1):
 return random.sample(string.hexdigits, len)
 
 # 生成干扰字符
 def punctuation(self, len=1):
 return tuple(random.sample(string.punctuation, len))
 
 # 定义干扰字符颜色
 def random_color(self, min=64, max=255):
 return tuple((random.randint(min, max) for i in range(3)))
 
 # 生成验证码
 def creat_code(self, width=80, height=24, color=(192, 192, 192)):
 image = Image.new('RGB', (width, height), color)
 #建议下载几款字体,变换下风格,我在setting粒定义了static路径,这里就直接导入了
 font = ImageFont.truetype(os.path.join(settings.STATICPATH, 'fonts/Lora-Regular.ttf'), 20)
 draw = ImageDraw.Draw(image)
 self.fill_color(draw, image, 5)
 self.fill_dischar(draw, image, 10)
 code = self.fill_char(draw, image, 4, 10, font)
 image_name = '{}.jpeg'.format(uuid.uuid4().hex)
 image_path = os.path.join(settings.STATICPATH, 'code/{}'.format(image_name))
 print(image_path)
 image.save(image_path)
 return {'code': code, 'image_path': image_path}
 
 # 填充颜色
 def fill_color(self, draw, image, interval):
 for i in range(0, image.width, interval):
  for j in range(0, image.height, interval):
  draw.point((i, j), fill=self.random_color())
 
 # 填充验证码
 def fill_dischar(self, draw, image, interval):
 for i in range(0, image.width, interval):
  dis = self.punctuation()
  j = random.randrange(3, image.height - 3)
  draw.text((i, j), dis[0], fill=self.random_color(64, 255))
 
 # 填充验证码
 def fill_char(self, draw, image, num, interval, font):
 code = ''
 for i in range(num):
  cha = self.random_hexdigits()
  code += str(cha[0])
  j = random.randrange(0, 5)
  # print(cha)
  # print(image.width*(i/num)+interval,j)
  draw.text((image.width * (i / num) + interval, j), cha[0], fill=self.random_color(32, 127), font=font)
 return code


if __name__ == "__main__":
 code = Code()
 print(code.creat_code())

flask路由配置

import os
from flask import Flask, Response
from flask import render_template
from utils.code import Code

app = Flask(__name__)


@app.route('/')
def Register():
 return render_template('verify.html')


@app.route('/codes/')
def code():
 infor = Code().creat_code()
 image_path = infor["image_path"]
 code = infor['code']
 
 print(image_path)
 with open(image_path, 'rb') as f:
  image_content = f.read()
 os.remove(image_path)
 return Response(image_content, mimetype='jpeg')


if __name__ == '__main__':
 app.run(debug=True)

前端配置

<div class='form-row'>
   <form id="email_register_form" method="post" autocomplete="off">
    <div class="form-group ">
     <label>邮     箱</label>
     <input type="text" id="id_email" name="email" value="None" placeholder="请输入您的邮箱地址"/>
    </div>
    <div class="form-group ">
     <label>密     码</label>
     <input type="password" id="id_password" name="password" value="None" placeholder="请输入6-20位非中文字符密码"/>
    </div>
    <div class="form-group captcha1 ">
     <label>验 证 码</label>
     <img src="/codes/" alt="captcha" title="点击切换" class="captcha"
       onclick="this.src='codes/?'+Math.random()"/>
     <input autocomplete="off" id="id_captcha_1" name="captcha_1" height="30px" type="text">
    </div>
    <input class="btn btn-green" id="jsEmailRegBtn" type="submit" value="注册"/>
   </form>

源码分享:https://github.com/geekdick/pythonDemo/tree/master/verify

Python 相关文章推荐
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
Python计算两个日期相差天数的方法示例
May 23 Python
Python实现类的创建与使用方法示例
Jul 25 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
查看django版本的方法分享
May 14 Python
pandas取出重复数据的方法
Jul 04 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
python实现斗地主分牌洗牌
Jun 22 Python
基于opencv实现简单画板功能
Aug 02 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
python实现一个简单的贪吃蛇游戏附代码
Jun 28 Python
Python读取Word(.docx)正文信息的方法
Mar 15 #Python
30秒轻松实现TensorFlow物体检测
Mar 14 #Python
tensorflow识别自己手写数字
Mar 14 #Python
磁盘垃圾文件清理器python代码实现
Aug 24 #Python
Django自定义用户认证示例详解
Mar 14 #Python
python如何压缩新文件到已有ZIP文件
Mar 14 #Python
python中format()函数的简单使用教程
Mar 14 #Python
You might like
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
php cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十五)
2014/06/30 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
javascript 数组的方法集合
2008/06/05 Javascript
JavaScript数据类型详解
2015/04/01 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
Python命名空间的本质和加载顺序
2018/12/17 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
软件工程师面试题
2012/06/25 面试题
饮料业务员岗位职责
2013/12/15 职场文书
毕业生自荐书模版
2014/01/04 职场文书
初中生期末评语大全
2014/04/24 职场文书
北京奥运会主题口号
2014/06/13 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
自荐信大全
2019/03/21 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
mysql的数据压缩性能对比详情
2021/11/07 MySQL