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 相关文章推荐
python实现的各种排序算法代码
Mar 04 Python
python中如何使用正则表达式的集合字符示例
Oct 09 Python
Python面向对象编程基础解析(二)
Oct 26 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
Jun 05 Python
python中字符串内置函数的用法总结
Sep 13 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
python网络应用开发知识点浅析
May 28 Python
python django 原生sql 获取数据的例子
Aug 14 Python
OpenCV+face++实现实时人脸识别解锁功能
Aug 28 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
python实现的分层随机抽样案例
Feb 25 Python
Pycharm Git 设置方法
Sep 15 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
PHP教程 变量定义
2009/10/23 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
PHP设计模式(四)原型模式Prototype实例详解【创建型】
2020/05/02 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
vue防止花括号{{}}闪烁v-text和v-html、v-cloak用法示例
2019/03/13 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python做量化投资系列之比特币初始配置
2018/01/23 Python
python编程测试电脑开启最大线程数实例代码
2018/02/09 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
Python读写压缩文件的方法
2020/07/30 Python
关于python中导入文件到list的问题
2020/10/31 Python
Python常用外部指令执行代码实例
2020/11/05 Python
Mavi牛仔裤美国官网:土耳其著名牛仔品牌
2016/09/24 全球购物
爱尔兰旅游网站:ebookers.ie
2020/01/24 全球购物
单位办理社保介绍信
2014/01/10 职场文书
采购助理岗位职责
2014/02/16 职场文书
赡养老人协议书
2014/04/21 职场文书
大学体育课感想
2015/08/10 职场文书