1. 验证码
验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart),全自动区分计算机和人类的图灵测试的简称,一种区分用户是计算机还是人的公共全自动程序。防止恶意破解密码、刷票、论坛灌水、恶意注册、网络爬虫,有效防止黑客对某一个特定注册用户、用特定程序暴力破解方式进行不断的登录尝试。 -- 百度百科
验证码通常使用一些线条和一些不规则的字符随机组成。常见验证码:
2. 使用 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
# settings.py
INSTALLED_APPS = [
......
'multi_captcha_admin' # multi_captcha_admin 在 django.contrib.admin 前
......
'django.contrib.admin'
'captcha',
]
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
## 添加 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_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> 
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
<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>#} <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> 
参考资料:
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我希望我的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
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务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
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习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总线个人知识总