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 相关文章推荐
python3学习笔记之多进程分布式小例子
Feb 13 Python
python3+selenium实现126邮箱登陆并发送邮件功能
Jan 23 Python
Python元组知识点总结
Feb 18 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
python求绝对值的三种方法小结
Dec 04 Python
关于Django Models CharField 参数说明
Mar 31 Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 Python
Pycharm添加虚拟解释器报错问题解决方案
Oct 13 Python
python如何修改文件时间属性
Feb 05 Python
Django视图类型总结
Feb 17 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php使用curl出现Expect:100-continue解决方法
2015/03/03 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
php读取本地json文件的实例
2018/03/07 PHP
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
React diff算法的实现示例
2018/04/20 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
详解Vscode中使用Eslint终极配置大全
2019/11/08 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
python传递参数方式小结
2015/04/17 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
NumPy.npy与pandas DataFrame的实例讲解
2018/07/09 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python流程控制语句的深入讲解
2020/06/15 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
介绍一下常见的木马种类
2014/11/15 面试题
财务工作个人求职的自我评价
2013/12/19 职场文书
文秘专业个人求职信
2013/12/22 职场文书
挂职自我鉴定
2014/02/26 职场文书
学员自我鉴定
2014/03/19 职场文书
天地会口号
2014/06/17 职场文书
地方白酒代理协议书
2014/10/25 职场文书
财政局个人年终总结
2015/03/03 职场文书
幼儿教师师德师风自我评价
2015/03/05 职场文书
表扬信格式模板
2015/05/05 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
北京爱情故事观后感
2015/06/12 职场文书
go开发alertmanger实现钉钉报警
2021/07/16 Golang
Minikube搭建Kubernetes集群
2022/03/31 Servers
对讲机知识
2022/04/07 无线电
分享Python异步爬取知乎热榜
2022/04/12 Python
JS前端使用canvas实现物体的点选示例
2022/08/05 Javascript