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 控制语句
Nov 03 Python
Python如何读取MySQL数据库表数据
Mar 11 Python
python计算auc指标实例
Jul 13 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
Python批处理更改文件名os.rename的方法
Oct 26 Python
基于python指定包的安装路径方法
Oct 27 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
Python实现简繁体转换
Jun 07 Python
Python下opencv库的安装过程及问题汇总
Jun 11 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读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP调用MySQL存储过程并返回值的方法
2014/12/26 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
php版微信公众平台之微信网页登陆授权示例
2016/09/23 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
用Juery网页选项卡实现代码
2011/06/13 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
2018/01/23 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
Python单链表简单实现代码
2016/04/27 Python
python itchat实现微信好友头像拼接图的示例代码
2017/08/14 Python
详解Python3 pandas.merge用法
2019/09/05 Python
使用Python实现画一个中国地图
2019/11/23 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
Python3爬虫关于识别检验滑动验证码的实例
2020/07/30 Python
python使用建议与技巧分享(一)
2020/08/17 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
女性时尚在线:IVRose
2019/02/23 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
计算机售后服务承诺书
2014/05/30 职场文书
小学生安全责任书
2014/07/25 职场文书
法定代表人授权委托书范文
2014/09/22 职场文书
2016中考冲刺决心书
2015/09/22 职场文书