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实现各种排序算法的代码示例总结
Dec 11 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
python将txt文件读入为np.array的方法
Oct 30 Python
使用Python获取网段IP个数以及地址清单的方法
Nov 01 Python
python 直接赋值和copy的区别详解
Aug 07 Python
Python搭建HTTP服务过程图解
Dec 14 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python如何使用Redis构建分布式锁
Jan 16 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
深入理解Pytorch微调torchvision模型
Nov 11 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
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
7个Javascript地图脚本整理
2009/10/20 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
jQuery仿京东商城楼梯式导航定位菜单
2016/07/25 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
javaScript实现滚动条事件详解
2020/03/24 Javascript
详解nodeJs文件系统(fs)与流(stream)
2018/01/24 NodeJs
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
WebSocket的简单介绍及应用
2019/05/23 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
使用python获取CPU和内存信息的思路与实现(linux系统)
2014/01/03 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
使用Python创建简单的HTTP服务器的方法步骤
2019/04/26 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
C语言笔试题回忆
2015/04/02 面试题
汽车服务工程专业自荐信
2014/09/02 职场文书
党支部党的群众路线对照检查材料
2014/09/24 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
教你用Python写一个植物大战僵尸小游戏
2021/04/25 Python
python正则表达式re.search()的基本使用教程
2021/05/21 Python