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动态加载变量示例分享
Feb 17 Python
Python制作exe文件简单流程
Jan 24 Python
python协程之动态添加任务的方法
Feb 19 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
PYTHON EVAL的用法及注意事项解析
Sep 06 Python
Python3 合并二叉树的实现
Sep 30 Python
Python使用正则实现计算字符串算式
Dec 29 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
Python的赋值、深拷贝与浅拷贝的区别详解
Feb 12 Python
Python多分支if语句的使用
Sep 03 Python
python 决策树算法的实现
Oct 09 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
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
JQuery获取文本框中字符长度的代码
2011/09/29 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
2017/03/14 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
微信小程序 蓝牙的实现实例代码
2017/06/27 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
D3.js实现拓扑图的示例代码
2018/06/30 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
pycharm 使用心得(八)如何调用另一文件中的函数
2014/06/06 Python
Python字符串逐字符或逐词反转方法
2015/05/21 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
python中time tzset()函数实例用法
2021/02/18 Python
会走动的图形html5时钟示例
2014/04/27 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
自我鉴定200字
2013/10/28 职场文书
个人简历自我评价八例
2013/10/31 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
毕业证明书
2015/06/19 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
幼儿园语言教学反思
2016/02/23 职场文书