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中return语句用法实例分析
Aug 04 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
python的Tqdm模块的使用
Jan 10 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Django实现web端tailf日志文件功能及实例详解
Jul 28 Python
python英语单词测试小程序代码实例
Sep 09 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
基于Python的EasyGUI学习实践
May 07 Python
给numpy.array增加维度的超简单方法
Jun 02 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
?繁体转换的class
2006/10/09 PHP
PHP 手机归属地查询 api
2010/02/08 PHP
php读取3389的脚本
2014/05/06 PHP
php简单统计在线人数的方法
2016/05/10 PHP
PHP MYSQL简易交互式站点开发
2016/12/27 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
jquery仿QQ商城带左右按钮控制焦点图片切换滚动效果
2013/06/27 Javascript
JavaScript 基本概念
2015/01/20 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
详解webpack的文件监听实现(热更新)
2020/09/11 Javascript
[01:31:02]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第一场
2019/08/22 DOTA
python中的全局变量用法分析
2015/06/09 Python
python中PIL安装简单教程
2016/04/21 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
Python中print和return的作用及区别解析
2019/05/05 Python
Python socket非阻塞模块应用示例
2019/09/12 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python 通过正则表达式快速获取电影的下载地址
2020/08/17 Python
linux mint中搜狗输入法导致pycharm卡死的问题
2020/10/28 Python
苏格兰销售女装、男装和童装的连锁店:M&Co
2018/03/16 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
往来会计岗位职责
2013/12/19 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
MySQL的join buffer原理
2021/04/29 MySQL
【海涛教你打dota】体验一超神发条:咱是抢盾专业户
2022/04/01 DOTA
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android