Django验证码的生成与使用示例


Posted in Python onMay 20, 2017

前言

本文主要介绍的是关于Django验证码生成与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

方法如下:

1、基于PIL生成一个带验证码的图片和验证码,生成验证码图片需要Monaco.ttf字体,可按自己要求更改check_code中的字体和字体文件位置,如下图

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter

_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))


def create_validate_code(size=(120, 30),
       chars=init_chars,
       img_type="GIF",
       mode="RGB",
       bg_color=(255, 255, 255),
       fg_color=(0, 0, 255),
       font_size=18,
       font_type="Monaco.ttf",
       length=4,
       draw_lines=True,
       n_line=(1, 2),
       draw_points=True,
       point_chance=2):
 """
 @todo: 生成验证码图片
 @param size: 图片的大小,格式(宽,高),默认为(120, 30)
 @param chars: 允许的字符集合,格式字符串
 @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
 @param mode: 图片模式,默认为RGB
 @param bg_color: 背景颜色,默认为白色
 @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
 @param font_size: 验证码字体大小
 @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
 @param length: 验证码字符个数
 @param draw_lines: 是否划干扰线
 @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
 @param draw_points: 是否画干扰点
 @param point_chance: 干扰点出现的概率,大小范围[0, 100]
 @return: [0]: PIL Image实例
 @return: [1]: 验证码图片中的字符串
 """

 width, height = size # 宽高
 # 创建图形
 img = Image.new(mode, size, bg_color)
 draw = ImageDraw.Draw(img) # 创建画笔

 def get_chars():
  """生成给定长度的字符串,返回列表格式"""
  return random.sample(chars, length)

 def create_lines():
  """绘制干扰线"""
  line_num = random.randint(*n_line) # 干扰线条数

  for i in range(line_num):
   # 起始点
   begin = (random.randint(0, size[0]), random.randint(0, size[1]))
   # 结束点
   end = (random.randint(0, size[0]), random.randint(0, size[1]))
   draw.line([begin, end], fill=(0, 0, 0))

 def create_points():
  """绘制干扰点"""
  chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]

  for w in range(width):
   for h in range(height):
    tmp = random.randint(0, 100)
    if tmp > 100 - chance:
     draw.point((w, h), fill=(0, 0, 0))

 def create_strs():
  """绘制验证码字符"""
  c_chars = get_chars()
  strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开

  font = ImageFont.truetype(font_type, font_size)
  font_width, font_height = font.getsize(strs)

  draw.text(((width - font_width) / 3, (height - font_height) / 3),
     strs, font=font, fill=fg_color)

  return ''.join(c_chars)

 if draw_lines:
  create_lines()
 if draw_points:
  create_points()
 strs = create_strs()

 # 图形扭曲参数
 params = [1 - float(random.randint(1, 2)) / 100,
    0,
    0,
    0,
    1 - float(random.randint(1, 10)) / 100,
    float(random.randint(1, 2)) / 500,
    0.001,
    float(random.randint(1, 2)) / 500
    ]
 img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲

 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)

 return img, strs

check_code.py

Django验证码的生成与使用示例

2、创建urls和views,请按自己需求创建

# 将check_code包放在合适的位置,导入即可,我是放在utils下面
from utils import check_code

def create_code_img(request):
 f = BytesIO() #直接在内存开辟一点空间存放临时生成的图片

 img, code = check_code.create_validate_code() #调用check_code生成照片和验证码
 request.session['check_code'] = code #将验证码存在服务器的session中,用于校验
 img.save(f,'PNG') #生成的图片放置于开辟的内存中
 return HttpResponse(f.getvalue()) #将内存的数据读取出来,并以HttpResponse返回

Views

urls我的设置:url(r'^create_code_img/', views.create_code_img)

3、前端应用验证码和点击自动刷新

<div class="row">
     <div class="col-xs-7">
      <input type="text" class="form-control" name="check_code" id="check_code" placeholder="请输入验证码">
     </div>
     <div class="col-xs-5">
      <img id="check_code_img" src="/create_code_img/" onclick="refresh_check_code(this)">
{#      src是url路径,可得到验证码图片,点击时调用refresh_check_code#}
     </div>
    </div>
<script>
   function refresh_check_code(ths) {
     ths.src += '?';
 {#    src后面加问好会自动刷新验证码img的src#}
   }
  </script>

4、login的Views进行数据验证,然后做相应的处理

post_check_code = request.POST.get('check_code')
session_check_code = request.session['check_code']
if post_check_code.lower() == session_check_code.lower() :
 pass

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
用python写asp详细讲解
Dec 16 Python
python 查找字符串是否存在实例详解
Jan 20 Python
Python实现嵌套列表去重方法示例
Dec 28 Python
使用Django启动命令行及执行脚本的方法
May 29 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
Python中按值来获取指定的键
Mar 04 Python
对PyQt5中的菜单栏和工具栏实例详解
Jun 20 Python
pandas对dataFrame中某一个列的数据进行处理的方法
Jul 08 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
用python解压分析jar包实例
Jan 16 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
Linux RedHat下安装Python2.7开发环境
May 20 #Python
深入理解Python中的内置常量
May 20 #Python
python万年历实现代码 含运行结果
May 20 #Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 #Python
python通过pip更新所有已安装的包实现方法
May 19 #Python
python django 实现验证码的功能实例代码
May 18 #Python
python实现发送邮件及附件功能
Mar 02 #Python
You might like
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
javascript实现密码验证
2015/11/10 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
vue中改变选中当前项的显示隐藏或者状态的实现方法
2018/02/08 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
Vuepress 搭建带评论功能的静态博客的实现
2019/02/17 Javascript
基于 vue-skeleton-webpack-plugin 的骨架屏实战
2019/08/05 Javascript
layui实现二维码弹窗、并下载到本地的方法
2019/09/25 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python模块学习 re 正则表达式
2011/05/19 Python
Python 变量类型及命名规则介绍
2013/06/08 Python
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
简述Python中的进程、线程、协程
2016/03/18 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
pandas删除指定行详解
2019/04/04 Python
python获取txt文件词向量过程详解
2019/07/05 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python 生成VOC格式的标签实例
2020/03/10 Python
详解python算法常用技巧与内置库
2020/10/17 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
向国旗敬礼学生寄语大全
2014/09/30 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
仙境之桥观后感
2015/06/16 职场文书
门面租赁合同范文
2019/08/06 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
django中websocket的具体使用
2022/01/22 Python