首页 > 其他分享 >验证码原理与Django实现--简单图片验证码

验证码原理与Django实现--简单图片验证码

时间:2024-07-29 18:26:33浏览次数:10  
标签:code obj img -- random request 验证码 Django

前言

在网页中常见图片中包含数字字母的验证码如下如果将其简化,那么我们可以认为验证码是由数字字母加上遮挡的线段所构成。本文,我们不妨先解决其中数字与字母的简单生成


数字字母的生成原理与代码实现

 首先,可以使用PIL库中的类Image和ImageDraw,用于生成图片和调用画笔对生成的图片进行修改。需要下载pillow库,导入时则为PIL

pip3.8 install pillow

选择好字体以及大小,就可以开始使用循环随机生成字母数字了,将每次生成的数字或字母拼接起来就组成了完整的验证码,再将其保存到session中,用于后续判断,最后使用io库中的BytesIO类临时保存该图片并将读取的图片返回。具体实现如下:

from io import BytesIO
from django.shortcuts import HttpResponse, render
from PIL import Image, ImageFont, ImageDraw

def num_code(request):
    # 创建一个图片
    img_obj = Image.new('RGB', (500, 200), color='white')
    # 实例化画笔
    img_draw = ImageDraw.Draw(img_obj)
    # 设置字体样式, 字体大小
    img_font = ImageFont.truetype('static/font/font_1.ttf', 50)
    # 验证码
    code = ''
    for i in range(5):
        # 随机生成
        random_upper = chr(random.randint(65, 90))  # 大写字母
        random_lower = chr(random.randint(97, 122))  # 小写字母
        random_int = str(random.randint(0, 9))  # 数字
        # 随机选择
        temp = random.choice([random_int, random_upper, random_lower])
        # 在图片上生成该验证码
        img_draw.text(xy=((i + 1) * 80, 75), text=temp, font=img_font, fill='black')
        code += temp

    # 将验证码存储在会话中
    request.session['captcha_code'] = code
    # 使用BytesIO进行临时存储
    io_obj = BytesIO()
    img_obj.save(io_obj, 'png')
    # 返回图片
    return HttpResponse(io_obj.getvalue())

前端页面的展示

前端页面主要是将img的路径表达正确,实现点击图片刷新的效果,实现如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
    <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
    <h1 style="text-align: center">验证码</h1>
    <div style="text-align: center;height: 300px;">
{#        路径表达#}
        <img src="/picture/{{ location }}/" id="id_img">
    </div>
    <form method="post">
        <div class="container">
            <div class="row justify-content-center">
                <div>
                    <div class="input-group" style="text-align: center">
                        <input type="text" class="form-control" placeholder="请输入验证码" id="id_code" name="input_code">
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="submit" id="id_confirm">确认</button>
                        </span>
                    </div><!-- /input-group -->
                </div>
            </div><!-- /.row -->
        </div>
    </form>
    <script>
        // 点击实现验证码刷新
        $('#id_img').click(function () {
            let time = new Date().getTime();
            $(this).attr('src', '/picture/{{ location }}/?' + time) ;
            // 或者更简单的:
            // $(this).attr('src', $(this).attr('src') + '?') ;
        })
    </script>
</body>
</html>

 界面展示:


后端对提交验证码的判断

 其实对验证码的判断并不难,而是想到if request.method == 'POST':达到一个分流的效果

def number_check(request, location):
    # 这个判断可以对访问起到分辨作用,即只有点击确认后才会进行获取并判断
    if request.method == 'POST':
        # 获取输入的验证码并进行判断
        input_code = str(request.POST.get('input_code'))
        store_code = request.session.get('captcha_code')
        # 不区分大小写
        if input_code.lower() == store_code.lower():
            return HttpResponse('验证码正确')
        else:
            return HttpResponse('验证码错误')
    return render(request, 'base.html', locals())

总结

原理并不难,较难的地方在于实操时能否将其综合起来

不足请指正

标签:code,obj,img,--,random,request,验证码,Django
From: https://blog.csdn.net/2301_80750923/article/details/140776677

相关文章

  • Adobe2024全家桶免费安装包下载路径+方法教程
    Adobe发布了其全家桶的最新版本Adobe2024。Adobe全家桶是一组由AdobeSystems开发和发行的图形设计、影像编辑与网络开发的软件产品套装,包括图像编辑软件Photoshop、矢量图形设计软件Illustrator等多款知名软件。Adobe全家桶的更新不仅意味着新功能的增加和性能的提升,也预示着......
  • Adobe2024全家桶下载+详细安装教程
    “我电脑里安装了20多个Adobe软件,但真正用到的只有PS。”近日,有网友在社交平台发帖称,自己的电脑里安装了大量Adobe软件,但实际上只经常使用Photoshop。对此,有其他网友回复道:“你这是买椟还珠,Adobe全家桶里有很多宝藏工具,比如AE、PR、AU等。”Adobe全家桶永久免费领取入口:http......
  • Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig
    title:Nuxt.js必读:轻松掌握运行时配置与useRuntimeConfigdate:2024/7/29updated:2024/7/29author:cmdragonexcerpt:本文详细介绍了Nuxt.js中的运行时配置功能,包括定义和使用运行时配置的方法,以及如何通过useRuntimeConfig访问配置。同时,讲解了环境变量与.env文......
  • Nuxt.js必读:轻松掌握运行时配置与 useRuntimeConfig
    title:Nuxt.js必读:轻松掌握运行时配置与useRuntimeConfigdate:2024/7/29updated:2024/7/29author:cmdragonexcerpt:本文详细介绍了Nuxt.js中的运行时配置功能,包括定义和使用运行时配置的方法,以及如何通过useRuntimeConfig访问配置。同时,讲解了环境变量与.env文......
  • Vue+cesium二次开发实例
    创建Vue3项目首先使用vue createvue-demo(自定义项目名)创建一个vue3项目接下来选择自定义配置,这里我们选择Router,其他几个按需选择选择vue3版本这里选择否(输入N),其他几项可以跳过,回车即可配置项目文件项目创建成功,接下来我们在VScode中打开这个文件夹,并新建一个终端......
  • C语言:指针的进阶
    指针的进阶一、字符指针(一)字符指针(二)常量字符串和字符数组二、指针数组和数组指针(一)指针数组int*p1[10](二)数组指针int(*p2)[10]三、函数指针(一)函数指针1、概念2、两段有趣的代码(1)(*(void(*)()0))();(2)void(*signal(int,void(*)(int)))(int);(二)函数指针数组......
  • JS:JSDoc 构建属于代码的说明书
    目录前言注释文档Q1:为什么我们需要在代码中添加注释?Q2:普通注释和文档注释有什么不同?Q3:为什么文档注释如此重要?Q4:如何写好文档注释?JSDoc:JavaScript代码的"说明书"什么是JSDoc?JSDoc能做什么?如何使用JSDoc?JSDoc的常用标签如何开始使用JSDoc?out目录简......
  • 【C++11】C++11新纪元:深入探索右值引用与移动语义
    ......
  • 在K8S中,pause容器作用是什么?
    在Kubernetes(K8S)中,pause容器是一个特殊的、由系统提供的最小容器,它被用作Pod网络命名空间中的一个占位符。每个Pod都有一个pause容器,即使用户没有显式地定义它。pause容器的主要作用是确保Pod中的所有其他容器可以共享网络栈。以下是pause容器的一些关键作用:......
  • 模拟冲刺(Sprint)
    用户地图  模拟冲刺Sprint队伍与选手信息展示用户故事:作为赛事观众或参赛者,我能够通过网页查看所有队伍及其选手的详细信息。任务拆分与开发时间设计队伍与选手的数据模型,并在后端数据库中创建相应表格。-6h实现后端API接口,用于获取队伍与选手信息。-8h设计并实现前端......