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实现简易通讯录修改版
Mar 13 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
实例介绍Python中整型
Feb 11 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
python图像和办公文档处理总结
May 28 Python
Python学习笔记之自定义函数用法详解
Jun 08 Python
python动态视频下载器的实现方法
Sep 16 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
Django多数据库联用实现方法解析
Nov 12 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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使用function_exists判断函数可用的方法
2014/11/19 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
php实现 master-worker 守护多进程模式的实例代码
2019/07/20 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
js里的prototype使用示例
2010/11/19 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变rgba的a值实现)
2019/01/24 Javascript
浅谈js闭包理解
2019/04/01 Javascript
js原生map实现的方法总结
2020/01/19 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
python编写暴力破解FTP密码小工具
2014/11/19 Python
python使用json序列化datetime类型实例解析
2018/02/11 Python
Python编写一个优美的下载器
2018/04/15 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
对Django中内置的User模型实例详解
2019/08/16 Python
python数据化运营的重要意义
2019/11/25 Python
django框架auth模块用法实例详解
2019/12/10 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
2020/10/29 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
二年级体育教学反思
2014/01/15 职场文书
难忘的一课教学反思
2014/04/30 职场文书
优秀家长事迹材料
2014/05/17 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
优秀新员工事迹材料
2019/05/13 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
Win11开始菜单添加休眠选项
2022/04/19 数码科技