Django验证码的生成与使用示例


Posted in Python onMay 20, 2017

前言

本文主要介绍的是关于Django验证码生成与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

方法如下:

1、基于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

check_code.py

Django验证码的生成与使用示例

2、创建urls和views,请按自己需求创建

# 将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返回

Views

urls我的设置:url(r'^create_code_img/', views.create_code_img)

3、前端应用验证码和点击自动刷新

<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>
    </div>
<script>
   function refresh_check_code(ths) {
     ths.src += '?';
 {#    src后面加问好会自动刷新验证码img的src#}
   }
  </script>

4、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不规范的日期字符串处理类
Jun 10 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
Python 微信之获取好友昵称并制作wordcloud的实例
Feb 21 Python
python调用自定义函数的实例操作
Jun 26 Python
Python虚拟环境的原理及使用详解
Jul 02 Python
python实现交并比IOU教程
Apr 16 Python
Python基于paramunittest模块实现excl参数化
Apr 26 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
Python实现生活常识解答机器人
Jun 28 Python
Linux RedHat下安装Python2.7开发环境
May 20 #Python
深入理解Python中的内置常量
May 20 #Python
python万年历实现代码 含运行结果
May 20 #Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 #Python
python通过pip更新所有已安装的包实现方法
May 19 #Python
python django 实现验证码的功能实例代码
May 18 #Python
python实现发送邮件及附件功能
Mar 02 #Python
You might like
PHP面试题之文件目录操作
2015/10/15 PHP
适用于初学者的简易PHP文件上传类
2015/10/29 PHP
php进程daemon化的正确实现方法
2018/09/06 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
Python Web程序部署到Ubuntu服务器上的方法
2018/02/22 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
深入了解python列表(LIST)
2020/06/08 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
Lookfantastic意大利官网:英国知名美妆购物网站
2019/05/31 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
大专生简历的自我评价
2013/11/26 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
项目采购员岗位职责
2014/04/15 职场文书
淘宝好评语大全
2014/05/05 职场文书
大学生应聘求职信
2014/05/26 职场文书
新教师培训方案
2014/06/08 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
协议书格式模板
2016/03/24 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
游戏《东方异文石:爱亚利亚黎明》正式版发布
2022/04/03 其他游戏
pycharm无法安装cv2模块问题
2022/05/20 Python