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 相关文章推荐
Python编写的com组件发生R6034错误的原因与解决办法
Apr 01 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
Oct 08 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
Sep 19 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
浅谈Python反射 &amp; 单例模式
Mar 21 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
Python下opencv图像阈值处理的使用笔记
Aug 04 Python
Python 根据数据模板创建shapefile的实现
Nov 26 Python
PyTorch的自适应池化Adaptive Pooling实例
Jan 03 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
Python基于locals返回作用域字典
Oct 17 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
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
php 启动报错如何解决
2014/01/17 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
React教程之Props验证的具体用法(Props Validation)
2017/09/04 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
[16:14]教你分分钟做大人:米拉娜(HEROS)
2014/11/24 DOTA
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
20行python代码实现人脸识别
2019/05/05 Python
Python是什么 Python的用处
2020/05/26 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
python如何实现图片压缩
2020/09/11 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
python里反向传播算法详解
2020/11/22 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
PHP开发的一般流程
2013/08/13 面试题
家长给学校的建议书
2014/05/15 职场文书
法人任命书范本
2014/06/04 职场文书
庆祝国庆节标语
2014/10/09 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
对学校的意见和建议
2015/06/04 职场文书
Ajax是什么?Ajax高级用法之Axios技术
2021/04/21 Javascript
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android