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 相关文章推荐
Eclipse + Python 的安装与配置流程
Mar 05 Python
python 链接和操作 memcache方法
Mar 04 Python
django实现同一个ip十分钟内只能注册一次的实例
Nov 03 Python
Python找出最小的K个数实例代码
Jan 04 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
python实现从pdf文件中提取文本,并自动翻译的方法
Nov 28 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python3.5 Pandas模块之DataFrame用法实例分析
Apr 23 Python
将python依赖包打包成window下可执行文件bat方式
Dec 26 Python
基于python修改srt字幕的时间轴
Feb 03 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Python图片处理之图片裁剪教程
May 27 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数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP Parse Error: syntax error, unexpected $end 错误的解决办法
2012/06/05 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
PHP编程计算文件或数组中单词出现频率的方法
2017/05/22 PHP
用javascript动态调整iframe高度的代码
2007/04/10 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
如何从0开始用node写一个自己的命令行程序
2018/12/29 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
从零学Python之入门(三)序列
2014/05/25 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Python创建空列表的字典2种方法详解
2020/02/13 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
2020/12/16 Python
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
90后毕业生的求职信范文
2013/09/21 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
尊师重教主题班会
2015/08/14 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android