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 GAE、Django导出Excel的方法
Nov 24 Python
python网络编程学习笔记(九):数据库客户端 DB-API
Jun 09 Python
Python的内存泄漏及gc模块的使用分析
Jul 16 Python
Python线程中对join方法的运用的教程
Apr 09 Python
PythonWeb项目Django部署在Ubuntu18.04腾讯云主机上
Apr 01 Python
OpenCV 模板匹配
Jul 10 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
python psutil监控进程实例
Dec 17 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
python生成大写32位uuid代码
Mar 03 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/08/04 PHP
PHP PDO函数库详解
2010/04/27 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
php addslashes 利用递归实现使用反斜线引用字符串
2013/08/05 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
2018/08/21 PHP
JavaScript 实现??打印?理
2007/04/28 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
在页面上用action传递参数到后台出现乱码的解决方法
2013/12/31 Javascript
巧用局部变量提升javascript性能
2014/02/24 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
jQuery实现的个性化返回底部与返回顶部特效代码
2015/10/30 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
浅谈时钟的生成(js手写简洁代码)
2016/08/20 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python中super()函数简介及用法分享
2016/07/11 Python
python递归打印某个目录的内容(实例讲解)
2017/08/30 Python
python对视频画框标记后保存的方法
2018/12/07 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python使用PyQt5的简单方法
2019/02/27 Python
python的等深分箱实例
2019/11/22 Python
python实现字典嵌套列表取值
2019/12/16 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
python网络编程之五子棋游戏
2020/05/14 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
Html5实现首页动态视频背景的示例代码
2019/09/25 HTML / CSS
保险专业大学生职业规划书
2014/03/03 职场文书
运动会表扬稿范文
2015/05/05 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
详细谈谈JavaScript中循环之间的差异
2021/08/23 Javascript
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技