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中给List添加元素的4种方法分享
Nov 28 Python
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
PyQt5实现类似别踩白块游戏
Jan 24 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
python 初始化一个定长的数组实例
Dec 02 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 Python
python中温度单位转换的实例方法
Dec 27 Python
python实现马丁策略的实例详解
Jan 15 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 file_exists问题杂谈
2012/05/07 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
PHP dirname功能及原理实例解析
2020/10/28 PHP
广告显示判断
2006/08/31 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
浅谈VueJS SSR 后端绘制内存泄漏的相关解决经验
2018/12/20 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python爬虫爬取美剧网站的实现代码
2016/09/03 Python
python 实现在txt指定行追加文本的方法
2018/04/29 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
python游戏地图最短路径求解
2019/01/16 Python
基于Python fminunc 的替代方法
2020/02/29 Python
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
护理专业毕业生自荐信范文
2014/01/05 职场文书
党建工作先进材料
2014/05/02 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
五四青年节演讲稿
2014/05/26 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
2014年党支部工作总结
2014/11/13 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
青年志愿者活动感想
2015/08/07 职场文书
共青团优秀团员申请书(范文)
2019/08/15 职场文书
六年级作文之家庭作文
2019/12/12 职场文书