Django框架之验证码简单实现

news2024/10/7 14:29:17

是一种方式防止csrf的策略。在用户注册、登录页面的时候使用;为了防止暴力请求,减轻服务器压力。

目录

安装pillow库

验证码显示

引入类库

视图方法

创建路由

创建表单

模板内容

模板路由

模板视图

视图验证

路由

引入

验证视图

效果

成功

失败

总结


安装pillow库

pillow 是 PIL 的替代版本,PIL 软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。验证码功能需要pillow来实现。

安装命令

pip install pillow

因为我已经安装了,所以显示如下:

 

验证码显示

引入PIL

这个是用来制作验证码图片的库,需要用到Image,ImageDraw,ImageFont

from PIL import Image, ImageDraw, ImageFont

引入random

接下来有一些随机数的应用需要用到random库

import random

视图方法

这个视图是一个完整实现验证码的方法,其中图片宽度、高度,字体间距,字体大小已经调整好。如果觉得不合适可以进行微调,都是单拎出来的变量。其中也设置了session可以在表单提交处理的时候获取以作验证。

注意:你本地的字体路径,可能需要改一下。

def verify_code(request):
    """ 验证码 """

    bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))
    width = 100
    height = 30
    # 字体间距
    spacing = width/4
    # 字体大小
    fontSize = 20

    # 创建画面对象
    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)

    # 定义验证码的备选值
    strs = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
    # 随机选取4个值作为验证码
    rand_str = ''
    for i in range(0, 4):
        rand_str += strs[random.randrange(0, len(strs))]
    # 构建字体对象
    font = ImageFont.truetype(r'C:\Windows\Fonts\微软雅黑\msyh.ttc', fontSize)
    # 构造字体颜色
    fontcolor1 = (255, random.randrange(0, 255), random.randrange(0, 255))
    fontcolor2 = (255, random.randrange(0, 255), random.randrange(0, 255))
    fontcolor3 = (255, random.randrange(0, 255), random.randrange(0, 255))
    fontcolor4 = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 绘制4个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
    draw.text((spacing, 2), rand_str[1], font=font, fill=fontcolor2)
    draw.text((spacing*2, 2), rand_str[2], font=font, fill=fontcolor3)
    draw.text((spacing*3, 2), rand_str[3], font=font, fill=fontcolor4)
    # 释放画笔
    del draw
    # 存入session,用于做进一步验证
    request.session['verify_code'] = rand_str
    # 内存文件操作
    import io
    buf = io.BytesIO()
    # 将图片保存在内存中,文件类型为png
    im.save(buf, 'png')
    # 将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(), 'image/png')

创建路由

path('verify_code', views.verify_code, name='verify_code')

访问当前路由可看到验证码图片。

创建表单

创建表单是用作显示验证码和提交表单内容校验验证码测试流程使用。

 

模板内容

verify.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="{% url 'app:verify_auth' %}" method="post">
  账号:<input type="text" name="username"><br>
  密码:<input type="password" name="pwd"><br>
  验证码:<img src="{% url 'app:verify_code' %}" alt="">
  <input type="text" name="code">
  {% csrf_token %}
  <br>
  <input type="submit" value="提交">
</form>
{{flag}}
</body>
</html>

模板路由

path('verify_login', views.verify_login, name='verify_login'),

模板视图

在这里显示表单模板。flag是用作显示错误提示。

def verify_login(request):
    """ 验证码表单 """

    flag = request.session.get('flag', '')
    return render(request, 'blog/verify.html', {'flag': flag})

视图验证

路由

path('verify_auth', views.verify_auth, name='verify_auth')

引入

redirect需要引入,在下面校验的时候,用来跳转使用。

from django.shortcuts import redirect

验证视图

分别获取服务端session值和表单提交的验证码值,统一做小写处理(大写也可以)。之后对比即可。判断后,正确的直接输出“登录成功!”;错误的设置flag内容,然后跳转到显示验证码的表单,并显示错误提示。这里redirect中的路由使用了反向解析。

def verify_auth(request):
    """ 验证码校验 """

    code = request.POST.get('code').lower()
    service_code = request.session['verify_code'].lower()
    if code != service_code:
        request.session['flag'] = '<p style="color:red">验证码不正确!</p>'
        return redirect('app:verify_login')
    else:
        return HttpResponse('登录成功!')

效果

成功

登录成功!

失败

总结

其实验证码的前端的实现原理和流程都大同小异,只是具体实现的语言不同罢了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从7K到20K,在测试行业摸爬滚打的这5年,想个2023年还没找到工作的提个醒~

我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触多了&#xff0c;吃个饭…

JMeter 接口测试教程,详解 HTTP Request 取样器和 fiddler 调试技巧!

目录 前言&#xff1a; 一、HTTP Request取样器介绍 二、使用HTTP Request取样器进行接口调试 1. 创建测试计划&#xff08;Test Plan&#xff09;和线程组&#xff08;Thread Group&#xff09; 2. 配置HTTP Request取样器参数 3. 添加断言 4. 运行接口测试 三、结合f…

Linux 企业级安全原理和防范技巧

Linux 企业级安全原理和防范技巧 1. 企业级Linux系统防护概述1.1 企业级Linux系统安全威胁1.2 企业级Linux系统安全立体式防范体系1.2.1 Linux文件系统访问安全1.2.2 Linux进程安全1. 进程的种类2. 进程管理方法 1.2.3 Linux用户管理安全1. 管理用户及组文件安全2. 用户密码管理…

【云计算】云存储是什么意思?与本地存储有什么区别?

云计算环境下&#xff0c;衍生了云存储、云安全、云资源、云管理、云支出等等概念。今天我们就来了解下什么是云存储&#xff1f;云存储与本地存储有什么区别&#xff1f; 云存储是什么意思&#xff1f; 云存储是一种新型的数据管理方式&#xff0c;它通过网络将大量不同类型、…

UGUI进阶知识[二十九]循环GridView

节省内存的常用滑动列表还有一种形式&#xff0c;上下滑动的GridView。这种格式的滑动列表可用于移动设备的背包&#xff0c;仓库&#xff0c;商店UI等数据可能海量从而导致产生特别多但又看不见的UI的情况。 于是基于 UGUI进阶知识[八]循环利用滑动列表的循环ListView工程做了…

普源1G带宽4通道10G采样率数字示波器MSO8104

超高性价比七合一 集成示波器在如今的集成设计领域&#xff0c;一款集成度较高的综合示波器已经成为设计工程师必不可少的得力工具。 MSO8000 系列数字示波器&#xff0c;它集 7 种独立仪器于一体&#xff0c;包括一台示波器、一台 16 通道逻辑分析仪、一台频谱分析仪、一台任…

煤矿电子封条建设实施方案算法 yolov7

煤矿电子封条建设实施方案算法通过yolov7网络模型深度学习技术&#xff0c;煤矿电子封条建设实施方案算法作为一种智能化安全新模式被广泛应用于各类场景中。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研究团队希望它能够同时支持移动 GPU 和从边缘到云端的…

高完整性系统:Separation Logic for Automated Verification

目录 1. INTRODUCTION TO SEPARATION LOGIC 分离逻辑 1.1 霍尔推理&#xff08;Hoare Reasoning&#xff09; 1.2 堆指针的影响 1.3 全局和局部推理&#xff08;Global and Local Reasoning&#xff09; 1.4 组合推理&#xff08;Compositional Reasoning&#xff09; 1.…

chatgpt赋能python:Python中怎样输入数据以及数据类型

Python中怎样输入数据以及数据类型 Python是一种高级编程语言&#xff0c;常用于数据处理和分析、机器学习和Web开发等任务。输入数据是Python编程中的重要环节&#xff0c;因此本文将介绍Python中输入数据的方法和数据类型。 什么是数据输入&#xff1f; 数据输入是指将数据…

国内主流AI大模型盘点

今年年初&#xff0c;轰动科技圈的大事就是ChatGPT的面世&#xff0c;它的到来打响了AI智能时代的第一枪&#xff0c;同时展开了一场别开生面的智能科技革命。 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿&#xff0c;国内的AI领域也开启了“…

StableStudio,比Midjourney还牛逼的绘画平台,免费!

大家好&#xff0c;我是鸟哥。 之前给大家推荐过Midjourney和Bluewillow两个AI绘画平台&#xff1a;简直了&#xff01;比Midjourney更刺激&#xff0c;还免费&#xff01;Midjourney功能超级强大&#xff0c;但比较傲娇&#xff0c;很贵&#xff0c;是否让用户免费体验要看心…

数据可视化系列指南之地图类图表大全

导语 随着数据在各行业中的应用越来越广泛&#xff0c;大家也逐渐认识到数据可视化在企业生产经营中的重要作用&#xff0c;在数据可视化过程中&#xff0c;图表是处理数据的重要组成部分&#xff0c;因为它们是一种将大量数据压缩为易于理解的格式的方法。数据可视化可以让受…

jar包和war包的区别;项目打包成jar或者war且运行在Linux上的tomcat

jar包和war包的区别&#xff1a; war包&#xff1a;通常是web应用后&#xff0c;例如网站&#xff0c;打成包部署到容器(可以是tomcat)中。含有包括WEB-INF包。war包通常就是放在tomcat包的/webapps下然后自动编译和运行。 jar包&#xff1a;通常是开发时要引用的类&#xff…

怎样使用Fiddler进行移动端抓包?附视频教程包你学会

目录 前言 抓包 什么是抓包 哪些场景下需要抓包 Fiddler Fiddler抓包原理 安装 Fiddler移动端抓包 第一步&#xff1a;允许远程计算机连接 第二步&#xff0c;设置手机网络代理 第三步&#xff0c;允许捕获HTTPS连接 第四步&#xff0c;手机安装证书 前言 本篇文章…

chatgpt赋能python:Python中如何提取字段中的数字

Python中如何提取字段中的数字 在数据分析和处理中&#xff0c;经常需要提取文本中的数字数据。在Python中&#xff0c;有多种方法可以实现这一操作。本篇文章将介绍Python中提取字段中的数字的方法&#xff0c;并给出示例代码。 使用正则表达式 正则表达式是Python中处理文…

二十、C++11(上)

文章目录 一、前言二、C11诞生简介三、列表初始化&#xff08;一&#xff09;{}初始化&#xff08;二&#xff09;initializer_list容器1. initializer_list 概念2. initializer_list的使用场景3. initializer_list接口函数模拟实现 四、关键字&#xff08;一&#xff09;auto&…

duilib中使用mfc控件

我在界面相隔挺远的位置添加2个mfc控件&#xff0c; 需要添加&#xff1a; 1. 添加 CMfcWndUI 类&#xff0c;这是为了调用mfc控件用的 2. 添加 duilib界面 CDuiFrameWnd 3.重写 2中界面的virtual CControlUI* CreateControl(LPCTSTR pstrClassName); 函数 需要注意的地方…

xray工具—代理扫描、爬虫扫描、Burp联动

xray工具—代理扫描、爬虫扫描、Burp联动 1. Xray介绍1.1. 支持漏洞检测类型1.2. 官网地址 2. 常用扫描模式2.1. 生成证书2.1.1. 浏览器安装证书 2.2. Xray基础主动扫描2.2.1. 基础主动扫描命令2.2.2. 基础主动扫描结果 2.3. Xray代理模式扫描2.3.1. 代理模式配置代理2.3.2. 代…

一场变革来到零售业,盖雅「劳动力账户」助力连锁门店全面管理人效

‍ 上半年&#xff0c;逐渐回暖的出游&#xff0c;为文旅和线下零售业的营收创造了希望&#xff0c; 但面对高周转率和低利润率的行业竞争格局&#xff0c;比起令人兴奋的营收&#xff0c;大部分零售企业仍在焦虑营收背后的成本。 或许是过去三年的环境让更多企业学会了「精…

Microsoft Build 两大主题:Copilots 和插件

在 Microsoft Build 中&#xff0c;贯穿会议的两个主要主题是 Copilots - 涵盖广泛产品和服务的 AI 助手 - 以及插件&#xff0c;它们有效地将 Copilots 转变为聚合器&#xff0c;可能使其成为企业和消费者客户的一站式商店。 微软MVP实验室研究员 张善友 深圳友浩达 CTO&…