Использование капчи captcha

Курс по Django: https://stepik.org/a/183363

Архив проекта: lesson-23-coolsite.zip

На данный момент у нас с вами получился уже полноценный сайт, но одна страница все еще не сделана – это форма обратной связи. Давайте ее добавим. Для начала вместо функции contact пропишем следующий класс представления (в файле women/views.py):

class ContactFormView(DataMixin, FormView):
    form_class = ContactForm
    template_name = 'women/contact.html'
    success_url = reverse_lazy('home')
 
    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        c_def = self.get_user_context(title="Обратная связь")
        return dict(list(context.items()) + list(c_def.items()))
 
    def form_valid(self, form):
        print(form.cleaned_data)
        return redirect('home')

Здесь все стандартно: определяем атрибуты form_class, template_name и success_url, а также методы: get_context_data и form_valid. Последний метод я прописал, чтобы продемонстрировать возможность обработки данных формы. Если пользователь все поля заполнил корректно, то будет вызван метод  form_valid(), в консоли увидим словарь с данными формы и выполнится перенаправление на главную страницу.

Далее, в файле women/forms.py пропишем класс формы:

class ContactForm(forms.Form):
    name = forms.CharField(label='Имя', max_length=255)
    email = forms.EmailField(label='Email')
    content = forms.CharField(widget=forms.Textarea(attrs={'cols': 60, 'rows': 10}))

Здесь тоже все так, как мы делали ранее, просто определены три поля для ввода.

Создадим шаблон contact.html с содержимым:

{% extends 'women/base.html' %}
 
{% block content %}
<h1>{{title}}</h1>
 
<form method="post">
    {% csrf_token %}
 
    <div class="form-error">{{ form.non_field_errors }}</div>
 
{% for f in form %}
<p><label class="form-label" for="{{ f.id_for_label }}">{{f.label}}: </label>{{ f }}</p>
<div class="form-error">{{ f.errors }}</div>
{% endfor %}
 
    <button type="submit">Отправить</button>
 
</form>
 
<p>{% endblock %}

И в файле women/urls.py свяжем маршрут contact с классом ContactFormView:

path('contact/', ContactFormView.as_view(), name='contact'),

Все, страница готова и полностью функциональна. Как вы понимаете, мы ее сделали не случайно. Следующим шагом добавим к этой форме так называемую капчу, то есть, графическую картинку с кодом, который нужно ввести, чтобы отправить данные формы на сервер. Это часто делают для защиты от ботов и на данный момент необходимый элемент всех открытых, публичных форм. Давайте это сделаем.

Вариантов для капчи множество и для фреймворка Django был разработан специальный модуль, который называется:

django-simple-captcha

Для его установки достаточно прописать команду:

pip install django-simple-captcha

и модуль готов к использованию. Ниже в описании модуля есть ссылка на документацию:

https://django-simple-captcha.readthedocs.io/en/latest/

где описывается как использовать этот пакет в своем приложении. Сделаем это. Вначале в файле settings.py пропишем этот модуль в списке установленных приложений:

INSTALLED_APPS = [
...
    'captcha',
...
]

Далее, по документации нам нужно выполнить миграцию:

python manage.py migrate

Затем, в корневой список маршрутов добавим строчку:

urlpatterns = [
...
    path('captcha/', include('captcha.urls')),
...
]

Все, привязка модуля к нашему приложению завершена и мы можем использовать ее в нашей форме. Для этого в файле women/forms.py импортируем класс для формирования поля капчи:

from captcha.fields import CaptchaField

и в классе ContactForm пропишем его:

captcha = CaptchaField()

По идее, это все, по умолчанию наша форма теперь имеет капчу и давайте посмотрим как все это будет работать. Переходим в браузер, обновляем страницу обратной связи и видим дополнительно еще и капчу. Соответственно, она будет меняться при каждом обновлении страницы.

Если нужен другой вид капчи, оформить ее в своих стилях, то для этого используется дополнительно класс CaptchaTextInput, пример представлен в документации:

https://django-simple-captcha.readthedocs.io/en/latest/advanced.html

Кроме того, если требуется поменять шрифт, или его размер, цвета и прочее, то можно прописывать соответствующие переменные (приведены там же) в файле settings.py.

Вот так в самом простом варианте можно подключать капчу к своим формам.

Курс по Django: https://stepik.org/a/183363

Видео по теме