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的词法分析与语法分析
May 18 Python
python修改注册表终止360进程实例
Oct 13 Python
git进行版本控制心得详谈
Dec 10 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
python3对拉勾数据进行可视化分析的方法详解
Apr 03 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Python安装whl文件过程图解
Feb 18 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
python 制作简单的音乐播放器
Nov 25 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学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php单例模式的简单实现方法
2016/06/10 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
jquery分页插件jquery.pagination.js使用方法解析
2016/04/01 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
用Axios Element实现全局的请求loading的方法
2018/03/15 Javascript
Angular项目如何升级至Angular6步骤全纪录
2018/09/03 Javascript
如何手动实现es5中的bind方法详解
2018/12/07 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
2019/02/21 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
python中去空格函数的用法
2014/08/21 Python
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
Python字典实现伪切片功能
2020/10/28 Python
药学专业大专生的自我评价
2013/12/12 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
空气环保标语
2014/06/12 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
委托书怎样写
2014/08/30 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
大学班长竞选稿
2015/11/20 职场文书
python中的被动信息搜集
2021/04/29 Python
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
Prometheus 监控MySQL使用grafana展示
2021/08/30 MySQL
MySQL约束超详解
2021/09/04 MySQL