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利用Guetzli批量压缩图片
Mar 23 Python
python机器学习实战之K均值聚类
Dec 20 Python
Python自定义装饰器原理与用法实例分析
Jul 16 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python集合是否可变总结
Jun 20 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
python如果快速判断数字奇数偶数
Nov 13 Python
Python matplotlib画曲线例题解析
Feb 07 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
django之导入并执行自定义的函数模块图解
Apr 01 Python
pip安装提示Twisted错误问题(Python3.6.4安装Twisted错误)
May 09 Python
python如何随机生成高强度密码
Aug 19 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
第六节 访问属性和方法 [6]
2006/10/09 PHP
php shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
php之XML转数组函数的详解
2013/06/07 PHP
ECMall支持SSL连接邮件服务器的配置方法详解
2014/05/19 PHP
php实现指定字符串中查找子字符串的方法
2015/03/17 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
jquery访问ashx文件示例代码
2014/08/11 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
jQuery实现冻结表格行和列
2015/04/29 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
JS改变页面颜色源码分享
2018/02/24 Javascript
微信小程序在线客服自动回复功能(基于node)
2019/07/03 Javascript
javascript操作元素的常见方法小结
2019/11/13 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
2017/12/03 Python
python3 读取Excel表格中的数据
2018/10/16 Python
python生成特定分布数的实例
2019/12/05 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
阿拉伯世界最大的电子卖场:Souq埃及
2016/08/01 全球购物
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
2014年学习委员工作总结
2014/11/14 职场文书
2015年保管员工作总结
2015/04/30 职场文书
环境卫生整治简报
2015/07/20 职场文书
客户答谢会致辞
2015/07/30 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
python 爬取哔哩哔哩up主信息和投稿视频
2021/06/07 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android