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 28 Python
python获取代理IP的实例分享
May 07 Python
Python设计模式之装饰模式实例详解
Jan 21 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
Aug 30 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
Jan 20 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
Python中zipfile压缩包模块的使用
May 14 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读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
Javascript - HTML的request类
2007/01/09 Javascript
仿163填写邮件地址自动显示下拉(无优化)
2008/11/05 Javascript
Mootools 1.2教程 滑动效果(Slide)
2009/09/15 Javascript
JQuery 1.4 中的Ajax问题
2010/01/23 Javascript
不使用中间变量,交换int型的 a, b两个变量的值。
2010/10/29 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
2015/11/30 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
vue基础之v-bind属性、class和style用法分析
2019/03/11 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
学python安装的软件总结
2019/10/12 Python
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
Camille Jewelry官网:现代女性时尚首饰
2019/07/07 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
工作自荐信
2013/12/11 职场文书
考试诚信承诺书
2014/05/23 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
党员个人党性分析材料
2014/12/18 职场文书
小王子读书笔记
2015/06/29 职场文书
Python 如何安装Selenium
2021/05/06 Python
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS