Django自定义插件实现网站登录验证码功能


Posted in Python onApril 19, 2017

前言

网站登录的时候我们常常会看到随机的验证码需要输入后台验证,如图:

Django自定义插件实现网站登录验证码功能

现在我们来实现在Django中通过自定制插件来实现随机验证

check_code.py

基于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

创建urls和views

views.py:

# 将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返回

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

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

html:

<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><br></div>

javascript:

<script>
   function refresh_check_code(ths) {
      ths.src += '?';
{# src后面加问好会自动刷新验证码img的src#}
     }
</script>

login的Views

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 相关文章推荐
编写自定义的Django模板加载器的简单示例
Jul 21 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
python逆向入门教程
Jan 15 Python
Python 修改列表中的元素方法
Jun 26 Python
python顺序执行多个py文件的方法
Jun 29 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
在python中做正态性检验示例
Dec 09 Python
通过python调用adb命令对App进行性能测试方式
Apr 23 Python
python安装后的目录在哪里
Jun 21 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
selenium3.0+python之环境搭建的方法步骤
Feb 01 Python
Python列表切片用法示例
Apr 19 #Python
Python编程判断这天是这一年第几天的方法示例
Apr 18 #Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 #Python
浅析python递归函数和河内塔问题
Apr 18 #Python
Python使用正则表达式实现文本替换的方法
Apr 18 #Python
Python外星人入侵游戏编程完整版
Mar 30 #Python
Python随机数用法实例详解【基于random模块】
Apr 18 #Python
You might like
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
php array的学习笔记
2012/05/16 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php绘制圆形的方法
2015/01/24 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
PHP实现笛卡尔积算法的实例讲解
2019/12/22 PHP
javascript中attribute和property的区别详解
2014/06/05 Javascript
JavaScript学习笔记之基础语法
2015/01/22 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
js省市联动效果完整实例代码
2015/12/09 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
js密码强度检测
2016/01/07 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
浅谈js中的bind
2019/03/18 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
python uuid模块使用实例
2015/04/08 Python
简单了解Python中的几种函数
2017/11/03 Python
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python列表推导式与生成器表达式用法示例
2018/02/08 Python
python用for循环求和的方法总结
2019/07/08 Python
在matplotlib中改变figure的布局和大小实例
2020/04/23 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
2020/05/25 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Paper Cape官网:美国婴儿和儿童服装品牌
2019/11/02 全球购物
酒鬼酒广告词
2014/03/21 职场文书
中学生演讲稿
2014/04/26 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2019让人心动的商业计划书
2019/06/27 职场文书