下面是关于“Django验证码的生成与使用示例”的完整攻略。
1. 生成验证码
在Django中,我们可以使用django-simple-captcha
库来生成验证码。django-simple-captcha
是一个轻量级的Django验证码应用,没有太多繁琐的设置,易于使用。
首先,需要安装django-simple-captcha
库,可以通过以下命令实现:
pip install django-simple-captcha
安装成功后,在settings.py
文件中将captcha
添加到INSTALLED_APPS
中。
INSTALLED_APPS = [
# ...
'captcha',
# ...
]
然后,在需要添加验证码的表单中,可以通过以下方式生成验证码:
from captcha.fields import CaptchaField
class MyForm(forms.Form):
captcha = CaptchaField()
最后,在需要显示验证码的模板中,可以通过以下方式展示验证码:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
当用户填写表单时,验证码将会自动生成并显示在表单中。
2. 核对验证码
在用户提交表单后,我们还需要核对用户输入的验证码是否正确。在views.py
文件中,可以通过以下方式核对验证码:
from captcha.models import CaptchaStore
def example_view(request):
# 获取captcha_id和验证码输入值
captcha_id = request.POST.get('captcha_0')
captcha_value = request.POST.get('captcha_1')
# 核对验证码是否正确
if captcha_id and captcha_value:
try:
captcha = CaptchaStore.objects.get(id=captcha_id)
if captcha.response == captcha_value.lower():
# 验证码输入正确
pass
else:
# 验证码输入错误
pass
except CaptchaStore.DoesNotExist:
# 验证码已失效
pass
需要注意的是,captcha_id
和captcha_value
参数是在提交表单时自动生成的。captcha_id
参数被储存在captcha_0
的input标签中,captcha_value
参数被储存在captcha_1
的input标签中。
3. 示例说明
下面,我们来看一下两个示例:
示例1:在注册页面中添加验证码
我们需要在用户注册页面上添加验证码以防止垃圾注册。我们可以先在forms.py
中定义注册表单并在其中添加验证码字段:
from captcha.fields import CaptchaField
class SignupForm(forms.ModelForm):
captcha = CaptchaField()
class Meta:
model = User
fields = ['username', 'password', 'captcha']
然后,我们在views.py
中定义注册视图函数并在其中实例化表单,生成并发送邮件验证。
from django.core.mail import send_mail
from django.template.loader import get_template
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
# 构建用户账户并加入数据库
user = form.save(commit=False)
user.set_password(form.cleaned_data['password'])
user.save()
# 向用户邮箱发送验证邮件
template = get_template('signup_email_template.html')
context = {'email': user.email}
body = template.render(context)
send_mail(
subject='请激活您的账户',
message='',
html_message=body,
from_email='noreply@example.com',
recipient_list=[user.email],
)
return HttpResponseRedirect('/signup/thanks/')
else:
form = SignupForm()
return render(request, 'signup.html', {'form': form})
最后,在注册页面模板中,我们插入一个验证码输入框,以及其他所需的表单元素。
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">注册</button>
</form>
示例2:过滤无效的评论
在另一种情况下,我们需要检查用户提交的评论是否合法。我们可以定义一个评论表单,然后在该表单中添加一个验证码字段。
from captcha.fields import CaptchaField
class CommentForm(forms.ModelForm):
captcha = CaptchaField()
class Meta:
model = Comment
fields = ['name', 'email', 'body', 'captcha']
然后在views.py
中,我们可以检查验证码是否输入正确,如果输入正确就保存评论,并重定向到之前的页面。
def post_comment(request, post_pk):
post = get_object_or_404(Post, pk=post_pk)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
# 检查验证码是否输入正确
captcha_id = request.POST.get('captcha_0')
captcha_value = request.POST.get('captcha_1')
if captcha_id and captcha_value:
try:
captcha = CaptchaStore.objects.get(id=captcha_id)
if captcha.response == captcha_value.lower():
# 验证码输入正确
comment.save()
return HttpResponseRedirect(post.get_absolute_url() + '#comments')
except CaptchaStore.DoesNotExist:
# 验证码已失效
pass
messages.warning(request, '验证码输入错误!')
else:
form = CommentForm()
return render(request, 'blog/post_detail.html', {
'post': post,
'form': form,
})
最后,在博客文章模板的评论区域中添加一个验证码输入框。
<form method="post" class="post-form">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">评论</button>
</form>
以上就是关于“Django验证码的生成与使用示例”的完整攻略,希望可以对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django验证码的生成与使用示例 - Python技术站