Django-Simple-Captcha验证码包使用方法详解
介绍
Django-Simple-Captcha是Django Web框架的一个验证码应用,它可以为你的Django网站提供基本的验证码功能。具体来讲,Django-Simple-Captcha可以帮助你在用户注册,登录等页面中加入验证码,防止恶意攻击以及机器人自动注册。
安装
有关Django-Simple-Captcha的详细安装过程,请参考Django-Simple-Captcha的官方文档。
配置
- 在你的项目settings.py文件中添加captcha,并设置相关参数:
# settings.py
INSTALLED_APPS = [
...
'captcha',
...
]
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_LENGTH = 6
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_arcs',)
以上配置实现了以下效果:
- 激活了captcha应用
- CAPTCHA_CHALLENGE_FUNCT 指定了生成验证码的方法。我们在本例中使用了生成随机字符串的方法。
- CAPTCHA_LENGTH 指定了验证码的长度,本例中为6。
-
CAPTCHA_NOISE_FUNCTIONS 是一个存储验证码外观特征的元组。在这里,我们将验证码与一些扭曲的弧形一起展示。
-
对于Django-Simple-Captcha的配置还需要在你的项目urls.py文件的urlpatterns中添加:
urlpatterns = [
...
path('captcha/', include('captcha.urls')),
...
]
这将指向captcha包中的URL,使其能够被访问到。
使用
- 在你的模板中添加验证码
{% extends 'base.html' %}
{% block content %}
<form method="post" action="/login/">
{% csrf_token %}
{{ form.username.label_tag }}
{{ form.username }}
{{ form.password.label_tag }}
{{ form.password }}
{% captcha %}
<button type="submit">Login</button>
</form>
{% endblock %}
在表单中加入{% captcha %}标签即可添加一个验证码, {% csrf_token %}为Django中post表单请求需要添加的跨域认证token。
- 在你的视图中添加验证码校验逻辑
在你的表单验证逻辑中添加对验证码的校验:
from django.contrib.auth import authenticate, login
from captcha.fields import CaptchaField
def login_view(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
captcha = form.cleaned_data['captcha']
# 验证码校验
if captcha:
if not CaptchaStore.objects.filter(response=captcha, hashkey=form.cleaned_data['captcha_0']).count():
return HttpResponse('验证码错误')
user = authenticate(request, username=username, password=password)
if user:
login(request, user)
return redirect('/')
else:
return HttpResponse('用户名或密码错误')
else:
form = LoginForm()
return render(request, 'login.html', context={'form': form})
我们首先已经从request.POST获取到了提交上来的表单数据,其中包括我们前端表单提交的验证码。接着我们先使用CaptchaStore获取到对应的验证码,并进行校验。
最终,如果校验结果成功,我们正常进行用户认证逻辑,并将用户信息保存到session中;如果校验结果不正确,则返回错误的信息。
示例说明
下面给出两个例子:
- 标准的验证码校验
我们假设用户在注册网站时需要输入验证码。在前端,我们可以通过添加{% captcha %}标签将验证码添加到提交表单中。在后端,我们需要像上述例子中一样,在表单数据中加入captcha字段,然后进行对应的校验。
- 验证码刷新功能
有些带有验证码的网站需要提供验证码刷新功能来应对各种恶意攻击,下面是一个简单的实现示例:
在前端,我们需要增加一个刷新验证码的按钮,当用户点击刷新按钮时,发送一个AJAX请求到后端获取新的验证码:
<button type="button" id="refresh-captcha">Refresh</button>
<script type="text/javascript">
$(document).ready(function () {
$('#refresh-captcha').click(function () {
$.get('/captcha/refresh/', function (data) {
$('#id_captcha_0').attr('value', data.hashkey);
$('#captcha-img').attr('src', data.image_url);
});
});
});
</script>
在上述代码中,我们首先给刷新的按钮添加了一个id,然后添加了一个点击事件,这个点击事件是向后端发送一个GET请求获取新的验证码数据,并更新到前端。
后端将用户点击刷新按钮的请求定向到视图函数captcha_refresh函数,这个函数将负责更新验证码数据并将新的验证码hashkey和图片url返回前端:
from django.views.decorators.http import require_GET
from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
@require_GET
def captcha_refresh(request):
new_captcha = CaptchaStore.generate_key()
to_json_response = {
'hashkey': new_captcha,
'image_url': captcha_image_url(new_captcha),
}
return JsonResponse(to_json_response)
在上述代码中,我们首先使用CaptchaStore对象生成一个新的验证码hashkey并将其保存到to_json_response字典中,然后使用captcha_image_url函数获取新的验证码图片url,将其一起返回前端。
通过上述代码,我们可以实现一个简单的验证码刷新功能。
结论
Django-Simple-Captcha是一个非常实用的Django验证码应用,可以帮助你快速实现验证码的添加和校验功能。在使用过程中,你需要给你的配置配置验证码生成方法以及其他基本参数,在前端添加{% captcha %}标签,在后端进行验证码的校验,从而实现验证码的添加和校验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django-simple-captcha验证码包使用方法详解 - Python技术站