首页 > 其他分享 >Django验证码配置与使用

Django验证码配置与使用

时间:2024-05-25 09:57:17浏览次数:24  
标签:配置 randrange random 验证码 verifycode Django import font

  • 在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力
  • 使用验证码也是一种有效的防止crsf的方法
  • 需要安装扩展:pip install pillow
  • 验证码效果如下图:

验证码视图

  • 新建viewsUtil.py,定义函数verifycode
  • 此段代码用到了PIL中的Image、ImageDraw、ImageFont模块,需要先安装Pillow(3.4.1)包,详细文档参考http://pillow.readthedocs.io/en/3.4.x/
  • Image表示画布对象
  • ImageDraw表示画笔对象
  • ImageFont表示字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”

*代码如下:

from django.http import HttpResponse
def verifycode(request):
    #引入绘图模块
    from PIL import Image, ImageDraw, ImageFont
    #引入随机函数模块
    import random
    #定义变量,用于画面的背景色、宽、高
    bgcolor = (random.randrange(20, 100), random.randrange(
        20, 100), 255)
    width = 100
    height = 25
    #创建画面对象
    im = Image.new('RGB', (width, height), bgcolor)
    #创建画笔对象
    draw = ImageDraw.Draw(im)
    #调用画笔的point()函数绘制噪点
    for i in range(0, 100):
        xy = (random.randrange(0, width), random.randrange(0, height))
        fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
        draw.point(xy, fill=fill)
    #定义验证码的备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    #随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += str1[random.randrange(0, len(str1))]
    #构造字体对象
    font = ImageFont.truetype('static/msyh.ttf', 23)
    #font = ImageFont.load_default().font
    #构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    #绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
    #释放画笔
    del draw
    #存入session,用于做进一步验证
    request.session['verifycode'] = rand_str
    #内存文件操作
    """
    python2的为
    # 内存文件操作
    import cStringIO
    buf = cStringIO.StringIO()
    """
    # 内存文件操作-->此方法为python3的
    import io
    buf = io.BytesIO()
    #将图片保存在内存中,文件类型为png
    im.save(buf, 'png')
    #将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

配置url

  • 在urls.py中定义请求验证码视图的url
from django.urls import path
from . import viewsUtil

urlpatterns = [
    path('verifycode/', viewsUtil.verifycode),
]

显示验证码

  • 在模板中使用img标签,src指向验证码视图
<img id='verifycode' src="/verifycode/" alt="CheckCode"/>
  • 启动服务器,查看显示成功
  • 扩展:点击“看不清,换一个”时,可以换一个新的验证码
<script type="text/javascript" src="/static/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
    $(function(){
        $('#verifycodeChange').css('cursor','pointer').click(function() {
            $('#verifycode').attr('src',$('#verifycode').attr('src')+1)
        });
    });
</script>
<img id='verifycode' src="/verifycode/?1" alt="CheckCode"/>
<span id='verifycodeChange'>看不清,换一个</span>
  • 为了能够实现提交功能,需要增加form和input标签
<form method='post' action='/verifycodeValid/'>
    <input type="text" name="vc">
    <img id='verifycode' src="/verifycode/?1" alt="CheckCode"/>
<span id='verifycodeChange'>看不清,换一个</span>
<br>
<input type="submit" value="提交">
</form>

验证

  • 接收请求的信息,与session中的内容对比
from django.http import HttpResponse

def verifycodeValid(request):
    vc = request.POST['vc']
    if vc.upper() == request.session['verifycode']:
        return HttpResponse('ok')
    else:
        return HttpResponse('no')
  • 配置验证处理的url
from django.urls import path

urlpatterns = [
    path('verifycodeValid/', views.verifycodeValid),
]

第三方

可以在网上搜索“验证码”,找到一些第三方验证码提供网站,阅读文档,使用到项目中

标签:配置,randrange,random,验证码,verifycode,Django,import,font
From: https://blog.csdn.net/xyh2004/article/details/139192133

相关文章

  • Django模板层之模板语法
    1.变量变量输出语法{{var}}当模版引擎遇到一个变量,将计算这个变量,然后将结果输出变量名必须由字母、数字、下划线(不能以下划线开头)和点组成当模版引擎遇到点("."),会按照下列顺序查询:字典查询,例如:foo["bar"]属性或方法查询,例如:foo.bar数字索引查询,例如:foo[bar]如......
  • Django视图层——2HttpReqeust对象&QueryDict对象
    HttpReqeust对象服务器接收到http协议的请求后,会根据报文创建HttpRequest对象视图函数的第一个参数是HttpRequest对象在django.http模块中定义了HttpRequest对象的API属性下面除非特别说明,属性都是只读的path:一个字符串,表示请求的页面的完整路径,不包含域名method:......
  • 【2024年电工杯A题】园区微电网风光储协调优化配置(思路、代码......)
    ......
  • nvm介绍、下载、安装、配置及使用,(Node Version Manager)nodejs版本管理切换工具
    1、介绍nvm在Web前端项目开发过程中,由于各种前端框架、插件以及Nodejs、Npm的飞速更新,在项目新开发或对老项目进行更新维护时,有些项目版本的配置和当前Node、Npm环境不匹配,导致运行报错,甚至都无法启动。nvm的出现就是为了解决以上问题的,nvm是一个Node.js版本管理器,......
  • clion的cMakeList.txt的配置
    保留第一第二行,从第三行开始,使用下面内容替换: #使用此CMakeList时,若要新建C++文件,请按照以下步骤:#1.右键根目录——新建——C/C++源文件#2.在弹出的对话框中,输入文件名(英文小写及下划线),后缀为".cpp",不要勾选“添加到目标”,点击确定。#3.点击左上角横线——文件......
  • MGRE实验——IP配置
    对R2首先其封装类型是hdlc配IP地址,然后进行环回这个接口默认是ppp封装,不用改接口直接配IP然后开启aaa服务然后定义这个账号是做ppp的对这个接口进行pap认证同上接下来对1进行配置其以太网地址ping的时候发现不通,因为对端的封装已经改为hdlc然后把1的封......
  • SpringBoot项目 制作邮箱 验证码发送(163)
     1.邮箱授权码获取邮箱--> 设置-->POP3/SMTP/IMAP-->开启服务(POP3/SMTP服务)-->授权码 开启并获取后将授权码保存下来。2.项目导入依赖<!--邮箱--><dependency><groupId>org.springframework.boot</groupId>......
  • 配置Ingress支持HTTPS访问(二):使用cert-manager申请证书
    目录一.系统环境二.前言三.Let'sEncrypt和cert-manager简介四.部署cert-manager4.1安装cert-manager4.2创建clusterissuer4.3申请域名4.4Cloudflare添加站点4.5修改阿里云的名称服务器为cloudflare名称服务器4.6获取APITokens4.7创建secret存储APItoken4.8配置clusteri......
  • BLE中的白名单过滤配置
    说明白名单作用非常简单,就是在设备进行广播(ADV),扫描(SCAN)和连接(CONN)过程中做一个过滤作用whitelist白名单的结构非常简单,只有两个参数Address_TypeAddress即地址和地址类型,类型即常见的Public和Random过滤配置ADV配置项说明Advertising_Filter_Policy=0x00不......
  • 配置freepbx asterisk sip nat 实现外部分机注册
    映射5160tcpudp映射10000-20000 可修改范围创建传统分机或在高级内转换为chan_sip配置sip  分机NAT如下 配置asterisksip全局nat设置外部内部ip   静态设置选择后(已经有外部ip) 动态在全局留空外部ip后设置动态主机域名(未测试)    ......