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的Django框架中的静态资源管理器django-pipeline
Apr 25 Python
Django框架中方法的访问和查找
Jul 15 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
django2 快速安装指南分享
Jan 05 Python
用TensorFlow实现多类支持向量机的示例代码
Apr 28 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
Python中交换两个元素的实现方法
Jun 29 Python
python 以16进制打印输出的方法
Jul 09 Python
python3的UnicodeDecodeError解决方法
Dec 20 Python
Python装饰器原理与基本用法分析
Jan 07 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
Python爬虫获取豆瓣电影并写入excel
Jul 31 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
php include的妙用,实现路径加密
2008/07/29 PHP
PHP字符串处理的10个简单方法
2010/06/30 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
2012/11/24 Javascript
初识Node.js
2014/09/03 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
详解Vue中localstorage和sessionstorage的使用
2017/12/22 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
python修改list中所有元素类型的三种方法
2018/04/09 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
django中模板的html自动转意方法
2018/05/27 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
python程序需要编译吗
2020/06/19 Python
Python爬虫抓取指定网页图片代码实例
2020/07/24 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
HTML5之tabindex属性全面解析
2016/07/07 HTML / CSS
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
会话Bean的种类
2013/11/07 面试题
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
董事长岗位职责
2013/11/30 职场文书
考核评语大全
2014/04/29 职场文书
2014年幼师工作总结
2014/11/22 职场文书
2015年学校德育工作总结
2015/04/22 职场文书
2015年党员创先争优公开承诺书
2015/04/27 职场文书
学习十八大的感悟
2015/08/11 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript