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 30 Python
bat和python批量重命名文件的实现代码
May 19 Python
python版本坑:md5例子(python2与python3中md5区别)
Jun 20 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
python并发编程之线程实例解析
Dec 27 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
大家都说好用的Python命令行库click的使用
Nov 07 Python
Django表单提交后实现获取相同name的不同value值
May 14 Python
python实现三阶魔方还原的示例代码
Apr 28 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注入点构造代码
2008/06/14 PHP
php相当简单的分页类
2008/10/02 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP chr()函数讲解
2019/02/11 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
子页向父页传值示例
2013/11/27 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
java必学必会之static关键字
2015/12/03 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
JavaScript代码模拟鼠标自动点击事件示例
2020/08/07 Javascript
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
学年自我鉴定
2014/01/16 职场文书
护士找工作求职信
2014/07/02 职场文书
保研专家推荐信范文
2015/03/25 职场文书
论文答辩开场白大全
2015/05/27 职场文书
六五普法学习心得体会
2016/01/21 职场文书