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抓取框架 Scrapy的架构
Aug 12 Python
浅析python中SQLAlchemy排序的一个坑
Feb 24 Python
在Python程序员面试中被问的最多的10道题
Dec 05 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
Sep 03 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
Python搭建HTTP服务过程图解
Dec 14 Python
TensorFLow 变量命名空间实例
Feb 11 Python
Python生成器常见问题及解决方案
Mar 21 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 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
PHP 和 MySQL 基础教程(一)
2006/10/09 PHP
php object转数组示例
2014/01/15 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
JS实现带有3D立体感的银灰色竖排折叠菜单代码
2015/10/20 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
深入理解jquery的$.extend()、$.fn和$.fn.extend()
2017/07/08 jQuery
react router 4.0以上的路由应用详解
2017/09/21 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
vue项目上传Github预览的实现示例
2018/11/06 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
vue实现鼠标移过出现下拉二级菜单功能
2019/12/12 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
Python 实例方法、类方法、静态方法的区别与作用
2019/08/14 Python
巧用 CSS3的webkit-box-reflect 倒影实现各类动效
2021/03/05 HTML / CSS
Html5实现单张、多张图片上传功能
2019/04/28 HTML / CSS
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
2014年政教处工作总结
2014/12/20 职场文书
团员个人总结
2015/02/26 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
员工辞职信范文大全
2015/05/12 职场文书
MySQL中in和exists区别详解
2021/06/03 MySQL
mysql联合索引的使用规则
2021/06/23 MySQL