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中类型关系和继承关系实例详解
May 25 Python
基于Python和Scikit-Learn的机器学习探索
Oct 16 Python
Python 获取div标签中的文字实例
Dec 20 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
May 07 Python
python+jinja2实现接口数据批量生成工具
Aug 28 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
Python 中由 yield 实现异步操作
May 04 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
Python集合的基础操作
Nov 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
php 什么是PEAR?(第三篇)
2009/03/19 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
用示例说明filter()与find()的用法以及children()与find()的区别分析
2013/04/26 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
简单实现bootstrap导航效果
2017/02/07 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
微信小程序实现图片懒加载的示例代码
2017/12/13 Javascript
AngularJS实现的简单拖拽功能示例
2018/01/02 Javascript
使用npm安装最新版本nodejs
2018/01/18 NodeJs
React 父子组件通信的实现方法
2019/12/05 Javascript
JS动态图片的实现方法完整示例
2020/01/13 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
python中__call__方法示例分析
2014/10/11 Python
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
对python3中, print横向输出的方法详解
2019/01/28 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
Python requests接口测试实现代码
2020/09/08 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
简述网络文件系统NFS,并说明其作用
2016/10/19 面试题
如何获得EntityManager
2014/02/09 面试题
入党积极分子思想汇报
2014/01/02 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
新员工试用期自我评价
2015/03/10 职场文书
2015年施工员工作总结范文
2015/04/20 职场文书
会计继续教育培训心得体会
2016/01/19 职场文书
Python基础之常用库常用方法整理
2021/04/30 Python
HTML基础详解(上)
2021/10/16 HTML / CSS