Django框架验证码用法实例分析


Posted in Python onMay 10, 2019

本文实例讲述了Django框架验证码用法。分享给大家供大家参考,具体如下:

验证码

1、作用

  • 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
  • 验证码需要使用绘图 Pillow
    • pip3 install Pillow
    • 核心API
    • Image
      • 需要模式
      • 尺寸
      • 背景色
    • ImageDraw
      • 绑定画布
      • 模式
      • 封装了绘制的API
      • text
      • point
      • line
      • arch
    • ImageFont
      • 手动指定字体

2、业务流程

绘制验证码图片

background = (10,20,30) // RGB颜色

初始化画布

image = Image.new(‘RGB',(100,50),background)

获取画布中画笔对象

draw = ImageDraw.Draw(image)

绘制验证码,随机四个

font = ImageFont.truetype(‘path',size)
fontcolor = (20,40,60)
draw.text((x,y),'R',font,fontcolor)

返回验证码内容

# 删除画笔
del draw
#保存图片到BytesIO对象
Import io
buf = io.BytesIO()
image.save(buf,'png')
#返回BytesIO中的内容
return HttpResponse(buf.getvalue(),'image/png')

3、代码范例

html页面

<form method="post" action="{% url 'sitesApp:login' %}">
  {% csrf_token %}
    <div class="login">
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">用户名</span>
       <input type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1" name="uName">
      </div>
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">密    码</span>
       <input type="text" class="form-control" placeholder="Password" aria-describedby="basic-addon1" name="uPswd">
      </div>
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">验证码</span>
       <input type="text" class="form-control" placeholder="Auth code" aria-describedby="basic-addon1" name="uCode">
      </div>
      <div class="vcode">
        <img src="/app/getvcode/" id="vcode">
      </div>
      <input type="submit" class="loginBtn" value="登 录"><br>
    </div>
  </form>
  <script type="text/javascript">
    $(function () {
      $('#vcode').click(function () {
        $(this).attr('src',"/app/getvcode"+Math.random())
      })
    })
  </script>

views视图

'''
生成并返回验证码
'''
def getvcode(request):
  # 随机生成验证码
  population = string.ascii_letters+string.digits
  letterlist = random.sample(population,4)
  vcode = ''.join(letterlist)
  # 保存该用户的验证码
  request.session['vcode']=vcode
  # 绘制验证码
  # 需要画布,长宽颜色
  image = Image.new('RGB',(176,60),color=getRandomColor())
  # 创建画布的画笔
  draw = ImageDraw.Draw(image)
  # 绘制文字,字体所在位置
  path = os.path.join(BASE_DIR,'static','fonts','ADOBEARABIC-BOLDITALIC.OTF')
  font = ImageFont.truetype(path,50)
  for i in range(len(vcode)):
    draw.text((20+40*i,0),vcode[i],fill=getRandomColor(),font=font)
  # 添加噪声
  for i in range(500):
    position = (random.randint(0,176),random.randint(0,50))
    draw.point(position,fill=getRandomColor())
  # 返回验证码字节数据
  # 创建字节容器
  buffer = io.BytesIO()
  # 将画布内容丢入容器
  image.save(buffer,'png')
  # 返回容器内的字节
  return HttpResponse(buffer.getvalue(),'image/png')
# 获取随机颜色
def getRandomColor():
  red = random.randint(0,255)
  green = random.randint(0,255)
  blue = random.randint(0,255)
  return (red,green,blue)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
实用自动化运维Python脚本分享
Jun 04 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
使用python对excle和json互相转换的示例
Oct 23 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
python实现列表的排序方法分享
Jul 01 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 Python
Python自动创建Excel并获取内容
Sep 16 Python
Python基于内置函数type创建新类型
Oct 22 Python
Python爬虫实现验证码登录代码实例
May 10 #Python
详解如何管理多个Python版本和虚拟环境
May 10 #Python
不到40行代码用Python实现一个简单的推荐系统
May 10 #Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 #Python
Python3列表内置方法大全及示例代码小结
May 10 #Python
详解python 爬取12306验证码
May 10 #Python
详解用python写一个抽奖程序
May 10 #Python
You might like
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php将数组转换成csv格式文件输出的方法
2015/03/14 PHP
PHP数组操作――获取数组最后一个值的方法
2015/04/14 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
使用jquery解析XML示例代码
2014/09/05 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
canvas雪花效果核心代码分享
2017/02/19 Javascript
NodeJs下的测试框架Mocha的简单介绍
2017/02/22 NodeJs
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
JavaScript数组去重实现方法小结
2020/01/17 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
Tornado高并发处理方法实例代码
2018/01/15 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
2018/06/26 Python
基于python指定包的安装路径方法
2018/10/27 Python
Python 下载及安装详细步骤
2019/11/04 Python
Python函数参数分类原理详解
2020/05/28 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
来自圣地亚哥的实惠太阳镜:Knockaround
2018/08/27 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
理货员的岗位职责
2013/11/23 职场文书
小区门卫管理制度
2014/01/29 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
2015年计生协会工作总结
2015/04/24 职场文书
幼儿园师德师风心得体会
2016/01/12 职场文书
管理者们如何制定2019年的工作计划?
2019/07/01 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
vue实现登陆页面开发实践
2022/05/30 Vue.js
Vue3实现简易音乐播放器组件
2022/08/14 Vue.js