验证码

关注公众号“轻松学编程”了解更多。

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">密&nbsp;&nbsp;&nbsp;&nbsp;码</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)

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

关注我,我们一起成长~~

Django做验证码登录的更多相关文章

  1. Delphi做验证码登录窗口

    在五月麦田的帮助下做成了,感觉挺好,验证码输入的时候需要大写: 组件:LabelEdit 3个  Button 2个  image 1个. 代码如下: unit Unit1; interface us ...

  2. Django(十六)基于模板的登录案例:登录装饰器、csrf攻击方式及防护、ajax的Post 的csrf开启写法、生成验证码、加验证码登录、反向解析+传参

    一.csrf攻击 1.1 csrf攻击(跨站请求伪造) [csrf攻击即]:通过第3方网站,伪造请求(前提条件是你已经登录正常网站,并保存了session或cookie登录信息且没有退出),第三方网站 ...

  3. WPF做验证码,小部分修改原作者内容

    原文地址:http://www.cnblogs.com/tianguook/p/4142346.html 首先感谢aparche大牛的帖子,因为过两天可能要做个登录的页面,因此,需要用到验证码,从而看 ...

  4. JCaptcha做验证码遇到的问题引出的思考

    JCaptcha用来做用户登录时期的验证码的,但是今天将开放的应用系统部署到生产环境的时候,遇到了问题,总是提示验证码不对.后台报出来下面的错误: com.octo.captcha.service.C ...

  5. SpringBoot + Spring Security 学习笔记(五)实现短信验证码+登录功能

    在 Spring Security 中基于表单的认证模式,默认就是密码帐号登录认证,那么对于短信验证码+登录的方式,Spring Security 没有现成的接口可以使用,所以需要自己的封装一个类似的 ...

  6. Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录

    浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...

  7. Spring Security构建Rest服务-0702-短信验证码登录

    先来看下 Spring Security密码登录大概流程,模拟这个流程,开发短信登录流程 1,密码登录请求发送给过滤器 UsernamePasswordAuthenticationFilter 2,过 ...

  8. Spring Security 实现手机验证码登录

    思路:参考用户名密码登录过滤器链,重写认证和授权 示例如下(该篇示例以精简为主,演示主要实现功能,全面完整版会在以后的博文中发出): 由于涉及内容较多,建议先复制到本地工程中,然后在细细研究. 1. ...

  9. Spring Security实现短信验证码登录

    Spring Security默认的一个实现是使用用户名密码登录,当初我们在开始做项目时,也是先使用这种登录方式,并没有多考虑其他的登录方式.而后面需求越来越多,我们需要支持短信验证码登录了,这时候再 ...

随机推荐

  1. Centos-分割文件-split

    split 分割文件,将一个文件分割为多个 相关选项 -b 指定文件大小,可以在size后面添加单位后缀,b表示512字节,k表示1KB,m表示MB -n 指定分割文件的长度,默认为1000行 -d ...

  2. golang go语言 实现链表

    package main import ( "errors" "fmt" "strconv" ) type List struct { Le ...

  3. 别人写的很好Arduino教材

    原文来自:https://www.arduino.cn/thread-31720-1-1.html 上一篇:Arduino教程--通过 库管理器 添加库 http://www.arduino.cn/t ...

  4. 题解【QTree3】

    题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...

  5. 彻底理解红黑树及JavaJDK1.8TreeMap源码分析

    1. 定义 红黑树也是二叉查找树,我们知道,二叉查找树这一数据结构并不难,而红黑树之所以难是难在它是自平衡的二叉查找树,在进行插入和删除等可能会破坏树的平衡的操作时,需要重新自处理达到平衡状态.红黑树 ...

  6. ansible-playbook通过github拉取部署Lnmp环境

    1. 配置服务器初始化  1.1) 关闭防火墙和selinux 1 [root@test-1 ~]# /bin/systemctl stop firewalld 2 [root@test-1 ~]# ...

  7. Python数据类型--列表(list)

    Python中列表对应的表示形式是"[]".列表中的元素可以是任何数据类型. 本文以List=[i for i in range(20)]为例进行论述:等价于List=[0, 1, ...

  8. 多测师讲解html _表格标签007_高级讲师肖sir

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>表 ...

  9. 多测师讲解 ———python2和Python3区别

    python3.x和python2.x的区别:1.Python3.X源码文件默认使用utf-8编码,而python2.x的编译最前端需要加上#coding=utf-82.python3.x里打印pri ...

  10. 2020已经过去五分之四了,你确定还不来了解一下JS的rAF?

    不会吧,不会吧,现在都2020年了不会还真人有人不知道JS的rAF吧??? rAF 简介 rAF是requestAnimationFrame的简称: 我们先从字面意思上理解requestAnimati ...