📜  如何在 django 表单中添加验证码 - Python (1)

📅  最后修改于: 2023-12-03 14:52:16.813000             🧑  作者: Mango

如何在 Django 表单中添加验证码

在网页应用程序中,为了防止机器人或者自动化程序恶意攻击或泄漏用户的隐私,常常需要使用验证码。本文将介绍如何在 Django 表单中添加验证码。

1. 安装 Django Simple Captcha

Django Simple Captcha 是 Django 应用程序,可以生成验证码图片,还提供了相应的验证功能。我们可以使用 pip 命令安装。

pip install django-simple-captcha
2. 在 settings.py 中添加配置

在 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'
3. 在表单中添加验证码字段

在需要添加验证码的表单中,添加一个新的字段来接收用户输入的验证码。

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()
4. 在模板中渲染验证码

在模板中,我们需要使用 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>
5. 处理表单提交数据

在视图中,需要使用表单的 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 表单中添加了验证码,可以大幅提高网站的安全性,并防止恶意攻击。