草庐IT

Django学习15 -- 验证码

Rolei_zl 2023-11-08 原文

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_LETTER_ROTATION = getattr(settings, "CAPTCHA_LETTER_ROTATION", (-35, 35))
    
    # 设置验证码前后背景色
    CAPTCHA_BACKGROUND_COLOR = getattr(settings, "CAPTCHA_BACKGROUND_COLOR", "#fff000")
    CAPTCHA_FOREGROUND_COLOR = getattr(settings, "CAPTCHA_FOREGROUND_COLOR", "#000000")
    
    # 设置验证码干扰线,降低被机器识别的风险
    CAPTCHA_NOISE_FUNCTIONS = getattr(
        settings,
        "CAPTCHA_NOISE_FUNCTIONS",
    ##    ("captcha.helpers.noise_arcs", "captcha.helpers.noise_dots"),
        ("captcha.helpers.noise_null", "captcha.helpers.noise_null"),
    )
    
    # 设置验证码字符长度
    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 源码

有关Django学习15 -- 验证码的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 如果为空或不验证数值,则使属性默认为 0 - 2

    我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  8. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  9. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  10. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

随机推荐