下面我来详细讲解一下“Django框架验证码用法实例分析”的完整攻略。
1. 什么是验证码?
验证码是指需要用户输入的一种区别于密码的识别字符,通常是由数字或字母组成,主要用于防止机器人恶意提交表单,保护网站安全和用户隐私。
2. Django中的验证码
Django中提供了很多验证码的第三方库,其中比较流行的有以下几种:
下面我们以django-captcha
为例,详细讲解在Django中如何使用验证码。
3. django-captcha
的安装和配置
首先,我们需要安装django-captcha
库:
pip install django-captcha
然后在settings.py
中加入以下配置:
INSTALLED_APPS = [
# ...
'captcha',
]
# 配置验证码
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_LENGTH = 4
CAPTCHA_FONT_SIZE = 25
CAPTCHA_TIMEOUT = 1
CAPTCHA_NOISE_FUNCTIONS = ('captcha.helpers.noise_dots',)
CAPTCHA_BACKGROUND_COLOR = '#ffffff'
CAPTCHA_FOREGROUND_COLOR = '#000000'
这里的配置项含义如下:
CAPTCHA_CHALLENGE_FUNCT
: 验证码生成函数,默认使用captcha.helpers.math_challenge
,即生成简单的数学题验证码。CAPTCHA_LENGTH
: 验证码长度,默认为4。CAPTCHA_FONT_SIZE
: 字体大小,默认为25。CAPTCHA_TIMEOUT
: 验证码有效时间,默认为2分钟。CAPTCHA_NOISE_FUNCTIONS
: 验证码干扰函数,默认为噪点干扰。CAPTCHA_BACKGROUND_COLOR
: 验证码背景色,默认为白色。CAPTCHA_FOREGROUND_COLOR
: 验证码前景色,默认为黑色。
4. 使用示例
4.1 注册页面示例
首先,在注册页面中引入django-captcha
的验证码模板:
{% load captcha %}
<form method="post" action="{% url 'register' %}">
{% csrf_token %}
<label for="username">用户名</label>
<input type="text" id="username" name="username"/>
<label for="password">密码</label>
<input type="password" id="password" name="password"/>
<label for="captcha">验证码</label>
{% captcha_image %}
<input type="text" id="captcha" name="captcha"/>
<button type="submit">注册</button>
</form>
其中,{% captcha_image %}
是生成验证码的标签,会自动生成一张验证码图片,用户输入的验证码将与该图片上显示的内容比较。
在后台视图中,我们需要验证用户输入的验证码是否正确,这可以通过captcha.helpers.verify
函数实现:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
from .forms import RegisterForm
def register(request):
if request.method == 'POST':
form = RegisterForm(request.POST)
if form.is_valid():
# 用户名、密码验证通过
username = form.cleaned_data['username']
password = form.cleaned_data['password']
# 验证码验证
captcha = form.cleaned_data['captcha']
captcha_id = request.POST.get('captcha_0')
if captcha and captcha_id:
try:
captcha = CaptchaStore.objects.get(hashkey=captcha_id).response
if captcha.lower() == form.cleaned_data['captcha'].lower():
# 验证码验证通过,创建用户
user = User.objects.create_user(username=username, password=password)
user.save()
# 注册成功,自动登录
user = authenticate(username=username, password=password)
login(request, user)
return redirect('home')
else:
# 验证码验证不通过
form.add_error('captcha', '验证码错误')
except CaptchaStore.DoesNotExist:
pass
else:
form = RegisterForm()
return render(request, 'register.html', {'form': form})
在这个示例中,我们通过CaptchaStore.objects.get(hashkey=captcha_id)
获取到用户输入的验证码对应的CaptchaStore
对象,然后将其response
(即验证码字符串)与用户输入的验证码比较。如果相同,则表示验证码验证通过,否则将错误信息添加到表单中。
4.2 忘记密码页面示例
下面是一个忘记密码页面的示例,该页面需要用户输入手机号和验证码,在提交表单后会发送一个验证短信到用户输入的手机号上:
{% load captcha %}
<form method="post" action="{% url 'forgot_password' %}">
{% csrf_token %}
<label for="phone">手机号</label>
<input type="text" id="phone" name="phone"/>
<label for="captcha">验证码</label>
{% captcha_image %}
<input type="text" id="captcha" name="captcha"/>
<button type="submit">下一步</button>
</form>
在后台视图中,我们需要验证用户输入的手机号和验证码,并记录用户的手机号信息,以便在后续步骤中使用:
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
from .forms import ForgotPasswordForm
def forgot_password(request):
if request.method == 'POST':
form = ForgotPasswordForm(request.POST)
if form.is_valid():
# 手机号、验证码验证通过
phone = form.cleaned_data['phone']
captcha = form.cleaned_data['captcha']
captcha_id = request.POST.get('captcha_0')
if captcha and captcha_id:
try:
captcha = CaptchaStore.objects.get(hashkey=captcha_id).response
if captcha.lower() == form.cleaned_data['captcha'].lower():
# 验证码验证通过,记录手机号
request.session['phone'] = phone
# 发送短信验证码
send_sms_code(phone)
return redirect('verify_code')
else:
# 验证码验证不通过
form.add_error('captcha', '验证码错误')
except CaptchaStore.DoesNotExist:
pass
else:
form = ForgotPasswordForm()
return render(request, 'forgot_password.html', {'form': form})
在这个示例中,我们通过request.session
将用户输入的手机号信息保存在session中,以便在后续步骤中使用。
结论
通过django-captcha
库,我们可以在Django中很方便地添加验证码功能,进一步增强网站的安全性和防止机器人的恶意攻击。上述示例仅仅是一些示意性的代码,实际使用时还需要对验证码输入错误次数进行限制等操作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django框架验证码用法实例分析 - Python技术站