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的线程来解决生产者消费问题的示例
Apr 02 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
python增加矩阵维度的实例讲解
Apr 04 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python3 批量扫描端口的例子
Jul 25 Python
python定位xpath 节点位置的方法
Aug 27 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
Django框架获取form表单数据方式总结
Apr 22 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 30 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
多文件上载系统完整版
2006/10/09 PHP
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
MySQL数据源表结构图示
2008/06/05 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
IE的fireEvent方法概述及应用
2013/02/22 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
ionic实现底部分享功能
2017/05/11 Javascript
Javascript实现base64的加密解密方法示例
2017/06/27 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
bootstrap switch开关组件使用方法详解
2017/08/22 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
CSS3按钮鼠标悬浮实现光圈效果源码
2016/09/11 HTML / CSS
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
社区母亲节活动记录
2014/03/06 职场文书
创文明城市标语
2014/06/16 职场文书
庆国庆活动总结
2014/08/28 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
Vue的过滤器你真了解吗
2022/02/24 Vue.js
JavaScript实现两个数组的交集
2022/03/25 Javascript