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实现简单登录验证
Apr 13 Python
Python入门教程之运算符与控制流
Aug 17 Python
python删除过期log文件操作实例解析
Jan 31 Python
python 把列表转化为字符串的方法
Oct 23 Python
Python实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
pycharm远程开发项目的实现步骤
Jan 20 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python Shapely使用指南详解
Feb 18 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
PyTorch的torch.cat用法
Jun 28 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
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
jquery中ajax学习笔记3
2011/10/16 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
浅谈jQuery 中的事件冒泡和阻止默认行为
2016/05/28 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
AngularJS出现$http异步后台无法获取请求参数问题的解决方法
2016/11/03 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
Vue 中mixin 的用法详解
2018/04/23 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
基于Webpack4和React hooks搭建项目的方法
2019/02/05 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
python解析文件示例
2014/01/23 Python
Python找出9个连续的空闲端口
2016/02/01 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
公务员更新知识培训实施方案
2014/03/31 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
高三复习计划
2015/01/19 职场文书
财务负责人岗位职责
2015/02/03 职场文书
家长对学校的意见和建议
2015/06/03 职场文书
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers