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调用机器喇叭发出蜂鸣声(Beep)的方法
Mar 23 Python
Python3读取文件常用方法实例分析
May 22 Python
Python实现给qq邮箱发送邮件的方法
May 28 Python
详解Python函数作用域的LEGB顺序
May 14 Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
python中正则表达式的使用方法
Feb 25 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Python设计模式之命令模式原理与用法实例分析
Jan 11 Python
Python解析json代码实例解析
Nov 25 Python
python实现简易版学生成绩管理系统
Jun 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
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
php类常量用法实例分析
2015/07/09 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
Laravel Reponse响应客户端示例详解
2020/09/03 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
JavaScript中exec函数用法实例分析
2015/06/08 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
JS实现给对象动态添加属性的方法
2017/01/05 Javascript
Vuejs实现带样式的单文件组件新方法
2017/05/02 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
微信小程序实现的绘制table表格功能示例
2019/04/26 Javascript
OpenLayers3实现图层控件功能
2020/09/25 Javascript
怎样使用Python脚本日志功能
2016/08/14 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python3 中文文件读写方法
2018/01/23 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
python将txt等文件中的数据读为numpy数组的方法
2018/12/22 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
Python中的元组介绍
2019/01/28 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
Python threading的使用方法解析
2019/08/28 Python
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
大学本科毕业生求职信范文
2013/12/18 职场文书
大家检讨书5000字
2014/02/03 职场文书
元旦趣味活动方案
2014/08/22 职场文书
红领巾广播站广播稿(3篇)
2014/09/20 职场文书
英文慰问信范文
2015/03/24 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android