📅  最后修改于: 2023-12-03 14:52:16.813000             🧑  作者: Mango
在网页应用程序中,为了防止机器人或者自动化程序恶意攻击或泄漏用户的隐私,常常需要使用验证码。本文将介绍如何在 Django 表单中添加验证码。
Django Simple Captcha 是 Django 应用程序,可以生成验证码图片,还提供了相应的验证功能。我们可以使用 pip 命令安装。
pip install django-simple-captcha
在 Django 项目的 settings.py
中添加以下配置,确保 Django Simple Captcha 能够正确地工作。
INSTALLED_APPS = [
# ...
'captcha',
]
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge'
CAPTCHA_LENGTH = 5
CAPTCHA_FONT_SIZE = 30
CAPTCHA_OUTPUT_FORMAT = '%(text_field)s %(hidden_field)s %(image)s'
在需要添加验证码的表单中,添加一个新的字段来接收用户输入的验证码。
from django import forms
from captcha.fields import CaptchaField
class ContactForm(forms.Form):
name = forms.CharField(max_length=100, label='Name')
email = forms.EmailField(required=True, label='Email')
message = forms.CharField(widget=forms.Textarea, label='Message')
captcha = CaptchaField()
在模板中,我们需要使用 Django Simple Captcha 提供的模板标签来渲染验证码图片和输入框。
<form method="post" action="{% url 'contact' %}">
{% csrf_token %}
<div class="form-group">
<label for="{{ form.name.id_for_label }}">Name</label>
{{ form.name }}
</div>
<div class="form-group">
<label for="{{ form.email.id_for_label }}">Email</label>
{{ form.email }}
</div>
<div class="form-group">
<label for="{{ form.message.id_for_label }}">Message</label>
{{ form.message }}
</div>
<div class="form-group">
{% captcha %}
</div>
<button type="submit" class="btn btn-primary">Send</button>
</form>
在视图中,需要使用表单的 is_valid()
方法来验证用户输入的数据是否正确,其中也包括验证码的验证。
from django.shortcuts import render
from django.core.mail import send_mail
from .forms import ContactForm
def contact(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
send_mail(
'Contact form submission',
f'Name: {name}\nEmail: {email}\nMessage: {message}',
email,
['your-email@example.com'],
fail_silently=False,
)
return render(request, 'contact/thankyou.html')
else:
form = ContactForm()
return render(request, 'contact/form.html', {'form': form})
现在,我们已经成功在 Django 表单中添加了验证码,可以大幅提高网站的安全性,并防止恶意攻击。