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通过floor函数舍弃小数位的方法
Mar 17 Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 Python
python去掉 unicode 字符串前面的u方法
Oct 21 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
Aug 12 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
在pytorch中动态调整优化器的学习率方式
Jun 24 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
Feb 03 Python
python自动化办公操作PPT的实现
Feb 05 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
JavaScript中的事件处理
2008/01/16 Javascript
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
小程序实现人脸识别功能(百度ai)
2018/12/23 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
2019/01/15 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
ES6对象操作实例详解
2020/05/23 Javascript
javascript开发实现贪吃蛇游戏
2020/07/31 Javascript
Python实现KNN邻近算法
2021/01/28 Python
Python实现批量压缩图片
2018/01/25 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
如果Session Bean得Remove方法一直都不被调用会怎么样
2012/07/14 面试题
商场经理竞聘演讲稿
2014/01/01 职场文书
超市国庆节促销方案
2014/02/20 职场文书
大学军训感言200字
2014/02/26 职场文书
环境卫生倡议书
2014/08/29 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
九年级语文教学反思
2016/03/03 职场文书
加薪申请书应该这样写!
2019/07/04 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js