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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 Python
python绘制简单折线图代码示例
Dec 19 Python
对python中的logger模块全面讲解
Apr 28 Python
Python实现压缩文件夹与解压缩zip文件的方法
Sep 01 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
更新修改后的Python模块方法
Mar 03 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
python绘制趋势图的示例
Sep 17 Python
python list的index()和find()的实现
Nov 16 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手册及PHP编程标准
2006/12/17 PHP
真正的ZIP文件操作类(php)
2007/07/21 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
2016/04/07 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
js使用心得分享
2015/01/13 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
Vue使用Canvas绘制图片、矩形、线条、文字,下载图片
2019/04/26 Javascript
JavaScript原型式继承实现方法
2019/11/06 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python异常和文件处理机制详解
2016/07/19 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
python 实现单通道转3通道
2019/12/03 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
tensorflow对图像进行拼接的例子
2020/02/05 Python
基于Numba提高python运行效率过程解析
2020/03/02 Python
Django Admin设置应用程序及模型顺序方法详解
2020/04/01 Python
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
业务代表的岗位职责
2013/11/16 职场文书
初中三年毕业生的自我评价分享
2014/02/14 职场文书
社区母亲节活动方案
2014/03/05 职场文书
社会实践活动总结范文
2014/07/03 职场文书
求职信范文怎么写
2015/03/19 职场文书
离婚案件上诉状
2015/05/23 职场文书
元旦主持词开场白
2015/05/29 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
MySQL transaction事务安全示例讲解
2022/06/21 MySQL