Django学习15 -- 验证码

news2024/11/27 22:39:11

1. 验证码

    验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart),全自动区分计算机和人类的图灵测试的简称,一种区分用户是计算机还是人的公共全自动程序。防止恶意破解密码、刷票、论坛灌水、恶意注册、网络爬虫,有效防止黑客对某一个特定注册用户、用特定程序暴力破解方式进行不断的登录尝试。 -- 百度百科
    验证码通常使用一些线条和一些不规则的字符随机组成。常见验证码:

  • 手机短信
  • 随机数字+字母
  • 随机汉字
  • 问题计算
  • 图形图像

2. 使用 django-simple-captcha

  • 安装 django-simple-captcha
# install captcha
pip install django-simple-captcha -i https://pypi.tuna.tsinghua.edu.cn/simple

# django_multi_captcha_admin
pip install django_multi_captcha_admin -i https://pypi.tuna.tsinghua.edu.cn/simple

# install Pillow, image libraries 
pip install Pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

# install django-ranged-response
pip install django-ranged-response -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 注册,captcha 、multi_captcha_admin作为app注册至 settings.py 
# settings.py
INSTALLED_APPS = [
    ......
    'multi_captcha_admin'    # multi_captcha_admin 在 django.contrib.admin 前
    ......
    'django.contrib.admin'
    'captcha',
]
  •  添加路由,将 captcha 作为访问地址添加到 urls.py
from django.urls import path, include

urlpatterns = [
    ......
    path('captcha/',include('captcha.urls')),  # 生成验证码
]
  • 创建验证码数据表,并同步数据
# 同步captcha数据表
python manage.py migrate

# 生成表 captcha_captchastore
>>> 
  Applying captcha.0001_initial... OK
  Applying captcha.0002_alter_captchastore_id... OK
  • 修改 login.html 页面
    将 %python_install_path%\Lib\site-packages\django\contrib\admin\templates\admin\login.html 拷贝至 Application 的 templates目录下,并扩展文件
## 添加 captcha 模块,用于在 username 和 password之后显示验证,默认4位
......
  <div class="form-row">
    {{ form.captcha.errors }}
    {{ form.captcha.label_tag }}  # 验证码标签,默认显示为 captcha
    {{ form.captcha}}
    <input type="hidden" name="next" value="{{ next }}">
  </div>
......
  • 修改 captcha 格式

    %python_path%\Lib\site-packages\captcha\conf\settings.py    或  %project_path%\venv\Lib\site-packages\captcha\conf\settings.py
    同时可以修改 captcha\templates\captcha 下的 HTML 文件,更改页面显示格式
    # 设置验证码字符长度
    CAPTCHA_LENGTH = int(getattr(settings, "CAPTCHA_LENGTH", 5))  # Chars
    
    # 设置验证码 输入 与 验证码 显示顺序
    CAPTCHA_OUTPUT_FORMAT = getattr(settings, "CAPTCHA_OUTPUT_FORMAT", None)
    -->
    CAPTCHA_OUTPUT_FORMAT = getattr(settings, "CAPTCHA_OUTPUT_FORMAT", u'%(text_field)s %(hidden_field)s %(image)s')
    
    # 超时时间
    CAPTCHA_TIMEOUT = getattr(settings, "CAPTCHA_TIMEOUT", 1)  # Minutes
  • 更新验证码
    - 刷新页面
    - 手动点击更新验证码
      <script type="text/javascript" charset="utf8" src="/static/js/jquery-3.4.1.min.js"> 
      </script>  # jquery path
      <script>
            $('.captcha').click(function () { # click function
                $.getJSON("/captcha/refresh/", function (result) {
                    $('.captcha').attr('src',result['image_url']);
                    $('#id_captcha_0').val(result['key'])
                });
            });
      </script>

  •  注意项

    - 使用空的上下文重定向到admin的login界面,验证码无法正式显示
    urlpatterns = [
        # path('admin/', admin.site.urls),
        path('', admin.site.urls),   # 任意访问重定向导致验证码无法正确显示
    ]
    
    # 通过指定具体的上下文使验证码正确显示
    urlpatterns = [
        path('admin/', admin.site.urls), 
        path('login/', admin.site.urls),
        # path('', admin.site.urls),   # 任意访问重定向导致验证码无法正确显示
    ]

3. 使用 verify.js

    jQuery 验证码插件 verify

  • 下载 verify.js 
     
     GitHub - katie1221/js-plugin: js插件
  • 安装

    - verify.js 放入 static/js 目录中(按个人系统设置)
    - verify.css 放入 static/css 目录中
  • 引入 verify.js (样式,脚本)
    <link rel="stylesheet" href="{% static "/js/verify.js/css/verify.css" %}">
    <script src="{% static "/js/verify.js/js/verify.js"%}"></script>
    {#<script src="/static/js/verify.js/js/verify.min.js"></script>#}
  • 使用 verify.js 设置验证码(具体参考 verify.js 源码)

    - 使用字符 或 算术验证
        <div class="form-row">
            <label class="required">验证码:</label>
            <div id="verify1"></div>
        </div>
    
        <script type="text/javascript">
            $('#verify1').codeVerify({
                type: 2,   //1 普通验证码; 非1 算法验证码
            	figure : 100,	//位数,仅在type=2时生效
            	arith : 0,	//算法,支持加减乘,0为随机,仅在type=2时生效
            	width : '350px',
    		    height : '30px',
                fontSize: '20px',
                codeLength: 6,
                btnId: 'check-btn',
    
                ready: function () {
                },
                success: function () {
                    alert('验证成功');
                },
                error: function () {
                    alert('验证失败');
                }
            });
        </script>

    -  划动块验证

        <script type="text/javascript">
            $('#verify2').slideVerify({
                type: 2,		// 1 普通滑动; 非1 图片滑动
            	mode : 'fixed',	//弹出式pop(鼠标移至拖动条时弹出图片),固定fixed
                vOffset: 5,	//偏移量
                vSpace: 5,	//间隔
                explain : '向右滑动完成验证',
                imgUrl : '{% static "/img/" %}',
                imgName : ['1.jpg', '2.jpg'],
                imgSize : {
    	        	width: '100%',
    	        	height: '200px',
    	        },
    	        blockSize : {
    	        	width: '50px',
    	        	height: '50px',
    	        },
    	        barSize : {
    	        	width : '100%',
    	        	height : '40px',
    	        },
    
                ready: function () {
                },
                success: function () {
                    alert('验证成功');
                },
                error: function () {
                    alert('验证失败');
                }
            });
        </script>

    - 点位验证

        <div class="form-row">
            <label class="required">验证码:</label>
            <div id="verify3"></div>
        </div>
    
        <script type="text/javascript">
    		$('#verify3').pointsVerify({
                mode : 'fixed',	//弹出式pop,固定fixed
    			defaultNum : 4,	//默认文字数量
    			checkNum : 4,	//校对文字数量
    			vSpace : 5,	//间隔
                imgUrl : '{% static '/img/'%}',
                imgName : ['1.jpg', '2.jpg'],
    			imgSize : {
    				width: '100%',
    				height: '200px',
    			},
    			barSize : {
    				width : '100%',
    				height : '40px',
    			},
    			ready : function() {
    			},
    			success : function() {
    				alert('验证成功);
    			},
    			error : function() {
                    alert('验证失败');
    			}
    		});
        </script>

    参考资料:

  • django-multi-captcha-admin · PyPI
  • django-captcha-admin · PyPI
  • Using django-simple-captcha — Django Simple Captcha 0.5.15 documentation
  • verify.js 源码

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

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

相关文章

Java+Swing+mysql实现学生选课管理系统

JavaSwing实现学生选课管理系统一、系统介绍二、系统展示1.课程查询2.课程添加3.退课三、系统实现四、其他1.其它系统2.获取源码一、系统介绍 本系统实现了学生登录和管理员登录&#xff0c;学生实现选课&#xff0c;查看已选课程&#xff0c;修改密码&#xff0c;查看学生信息…

Vue.use 与 Vue.prototype 在注册插件时,使用上有什么区别

很多使用Vue开发的童鞋&#xff0c;可能对Vue的原型对象prototype有了解过&#xff0c;但对于Vue.use只知如何使用&#xff0c;却不知其背后的含义。那么&#xff0c;今天我们就来瞧一瞧Vue.use()背后的逻辑。 &#x1f388; 首先&#xff0c;Vue.use()是什么&#xff1f; 官方…

外汇天眼:投资200美元起 每天收益7%!千万别被蒙蔽双眼!

12月14日&#xff0c;英国金融行为监管局( FCA )首次对 GoldVest FX 发出警告&#xff0c;提示投资者警惕与这家未经授权的公司打交道。 FCA警告称&#xff1a;GoldVest FX 在未经我们授权的情况下在英国提供金融服务或产品&#xff0c;如果一旦遭受资金损失&#xff0c;您将无…

logback-spring.xml 配置化说明记录如何在SpringBoot项目里面配置logback-spring.xml教程说明

目录 前言描述 logback-spring.xml 配置项详细 配置位置路径 前言描述 无论什么样的java应用都需要日志分级&#xff0c; 日志记录器(Logger)是日志处理的核心组件。log4j具有5种正常级别(Level)。 DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。1.static L…

【三维目标检测】FCAF3D(二)

FCAF3D数据和源码配置调试过程请参考上一篇博文&#xff1a;【三维目标检测】FCAF3D&#xff08;一&#xff09;_Coding的叶子的博客-CSDN博客。本文主要详细介绍FCAF3D网络结构及其运行中间状态。 1 模型总体过程 FCAF3D模型的整体结构如下图所示。该模型属于anchor-free目标…

SIoU Loss 原理与代码解析

paper&#xff1a;SIoU Loss: More Powerful Learning for Bounding Box Regression code&#xff1a;https://github.com/meituan/YOLOv6/blob/main/yolov6/utils/figure_iou.py#L75 存在的问题 之前的目标检测模型的回归损失考虑到了预测的bounding box和gt box之间的dis…

【头歌C语言程序与设计】选择结构程序设计进阶

目录 写在前面 正文 第1关&#xff1a;快递费用计算 第2关&#xff1a;计算一元二次方程的根 第3关&#xff1a;产品信息格式化 写在最后 写在前面 本文代码是我自己所作&#xff0c;本人水平有限&#xff0c;可能部分代码看着不够简练&#xff0c;运行效率不高,但都能运…

cmake笔记 编译与链接

文章目录概述编译最简单的hello world编译工程化的helloWorld更工程化的Hello World&#xff1a; 构建静态库与动态库如何使用外部共享库和头文件其他有用的cmake命令include_directoriesfind_package file(GLOB variable [RELATIVE path] [globbing expressions]...)windows 下…

【Maven基础】IDEA环境使用

第一节 创建父工程 1、创建 Project 2、开启自动导入 创建 Project 后&#xff0c;IDEA 会自动弹出下面提示&#xff0c;我们选择**『Enable Auto-Import』**&#xff0c;意思是启用自动导入。 这个自动导入一定要开启&#xff0c;因为 Project、Module 新创建或 pom.xml 每次…

微服务的相关概念及知识

微服务概念 微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出&#xff0c;他们定义了微服务是由单一应用程序构成的小服务&#xff0c;拥有自己的进程与轻量化处理&#xff0c;服务依业务功能设计&#xff0c;以全自动的方式部署&#xff0c;与其他服务使用HT…

6-zookeeper-hadoop-ha原理简述-fail

6-zookeeper-hadoop-ha故障转移机制&#xff0c;原理简述: HA概述&#xff08;2.X版本架构&#xff09;。 1&#xff09;、HA&#xff08;High available&#xff09;&#xff0c;即高可用&#xff08;7*24小时不间断服务。&#xff09; 1、zookeeper协调服务&#xff0c;通…

jsp+ssm计算机毕业设计毕业设计管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

Qt扫盲-QScrollBar理论总结

QScrollBar理论总结1. 简述2. 滚动条组成3. 常用设置5. 信号6. 键盘功能1. 简述 QScrollBar其实就是一个滚动条控件&#xff0c;它使用户能够访问大于用于显示文档的小组件的文档部分。它提供了用户在文档中的当前位置以及可见的文档量的可视指示。滚动条通常配备其他控件&…

什么是MOS管的米勒效应

在说MOS管的米勒效应之前我们先看下示波器测量的这个波形: 这个波形其实就是这个MOS管开关电路的波形&#xff0c;探头1这个黄色的测量的是MOS管的栅极&#xff0c;探头2这个蓝色的测量的是MOS管漏极 大家有没有发现这个黄色的波形在上升的过程中出现了一个平台&#xff0c;其实…

一年半经验如何准备前端面试

typeof NaN 的结果是什么&#xff1f; NaN 指“不是一个数字”&#xff08;not a number&#xff09;&#xff0c;NaN 是一个“警戒值”&#xff08;sentinel value&#xff0c;有特殊用途的常规值&#xff09;&#xff0c;用于指出数字类型中的错误情况&#xff0c;即“执行数…

如何快速拥有好的测试idea

如果接手任意一个测试任务&#xff0c;如何开始测试以及怎么快速的形成测试点呢?其实也是有一套小套路的。大概整理了下&#xff0c;可以从6个方面来考虑入手。 1.项目 快速了解项目背景、信息对象、项目风险、测试资料、债务、交流、语境分析、交付品、工具。 项目的提出动机…

0~9岁|一文讲清楚精细动作有多重要

人都有两宝&#xff1a;“双手和大脑”。 在我们的脑中枢神经内&#xff0c;有一部分专门掌管手部动作&#xff0c;手部动作越精细&#xff0c;与之对应的大脑神经元也就越发达。作为儿童智能的重要组成部分&#xff0c;精细动作还是衡量儿童神经系统发育的一个重要指标。 一、…

C++:继承、模板、CRTP:谈谈C++多态设计模式(三):函数模板

1&#xff1a;模板的概念 C中不止有 面向对象编程思想&#xff0c;还要泛型编程思想。而泛型编程思想的核心就是 模板 模板的建立大大提搞了复用行&#xff0c;C中的模板包括 &#xff1a;函数模板和类模板。 2&#xff1a;函数模板基本语法 函数模板 概念&#xff1a; 建立…

细粒度图像分类论文研读-2018

文章目录Object-Part Attention Model for Fine-grained Image Classification&#xff08;by localization- classification subnetwork&#xff09;AbstractIntroductionObject- Part Attention ModelObject- Part Spatial Constraint ModelOur OPAM ApproachObject-level At…

Flink从入门到放弃—Stream API—clean()方法

文章目录导航clean()案例贴上源码导航 涉及到文章&#xff1a; Flink从入门到放弃—Stream API—Join实现&#xff08;即多流操作&#xff09; Flink从入门到放弃—Stream API—常用算子&#xff08;map和flatMap&#xff09; Flink从入门到放弃—Stream API—常用算子(filter…