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使用arp欺骗伪造网关的方法
Apr 24 Python
Python2.x中文乱码问题解决方法
Jun 02 Python
Python实现检测文件MD5值的方法示例
Apr 11 Python
python list格式数据excel导出方法
Oct 31 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
Jul 12 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
公认8个效率最高的爬虫框架
Jul 28 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
Sep 15 Python
通过代码简单了解django model序列化作用
Nov 12 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
PHP中redis的用法深入解析
2014/02/20 PHP
PHP编程求最大公约数与最小公倍数的方法示例
2017/05/29 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
2018/08/17 PHP
网页中CDATA标记的说明
2010/09/12 Javascript
一个可拖拽列宽表格实例演示
2012/11/26 Javascript
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
js 获取范围内的随机数实例代码
2016/08/02 Javascript
Js遍历键值对形式对象或Map形式的方法
2016/08/08 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
使用vue-cli3 创建vue项目并配置VS Code 自动代码格式化 vue语法高亮问题
2019/05/14 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python中import机制详解
2017/11/14 Python
Python实现识别手写数字大纲
2018/01/29 Python
python实现梯度下降算法
2020/03/24 Python
python版DDOS攻击脚本
2019/06/12 Python
pytorch 共享参数的示例
2019/08/17 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
python将数组n等分的实例
2019/12/02 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
乡镇一岗双责责任书
2015/01/29 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript