Django 5 для начинающих

Прогресс по курсу:  9/1004

11.4 Добавление ReCAPTCHA для форм
2 из 2 шагов пройдено

Первым делом откроем форму приложения accounts, и добавим новое поле recaptcha и импорт функции ReCaptchaField:

from django_recaptcha.fields import ReCaptchaField


class UserLoginForm(AuthenticationForm):
    """
    Форма авторизации на сайте
    """

    recaptcha = ReCaptchaField()

    class Meta:
        model = User
        fields = ['username', 'password', 'recaptcha']
    def __init__(self, *args, **kwargs):
        """
        Обновление стилей формы регистрации
        """
        super().__init__(*args, **kwargs)
        self.fields['username'].widget.attrs['placeholder'] = 'Логин пользователя'
        self.fields['username'].widget.attrs['class'] = 'form-control'
        self.fields['password'].widget.attrs['placeholder'] = 'Пароль пользователя'
        self.fields['password'].widget.attrs['class'] = 'form-control'
        self.fields['username'].label = 'Логин'

Также мы изменили вывод формы, а именно убрали цикл, в котором ко всем полям добавляется класс form-control от Bootstrap, иначе к полю капчи тоже бы был добавлен класс form-control и она перестала бы работать.

Теперь если мы перейдем на страницу авторизации, то увидим следующее:

Таким образом мы установили капчу на страницу авторизации. По аналогии мы можем добавить капчу на страницы регистрации, изменения профиля, отправки комментария и тд.


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

На Windows PC удалось настроить капчу без проблем

Попробовал воспроизвести на Mac, здесь столкнулся с проблемой: после отправки формы с капчей, возникает ошибка:

URLError

urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)>

Попробовал перевести проект на SSL (с помощью Django Extensions запустил на порту 8443), это ситуацию никак не изменило, ошибка та же. 

Кто-то сталкивался с подобной проблемой на macOS?

@ilya_kutaev, попробуйте установить или обновить сертификаты:

pip install --upgrade certifi

@Дмитрий_Селезнев, Не помогло, ошибка та же.

На WinPC стоит Python 3.12, на маке 3.11 - попробую "сравнять" версии для начала

@ilya_kutaev, Обновил версию Python до 3.12.2, это ничего не изменило. Пока отключил капчу

Изменен ilya kutaev

@ilya_kutaev, посмотрите этот комментарий: https://stepik.org/lesson/973393/step/3?discussion=8359265&reply=8362352&unit=980245

@Дмитрий_Селезнев, Спасибо, помогло!

Команды нужно выполнять в системном Terminal, а не в терминале PyCharm

В моем случае они такие:

pip install --upgrade certifi

/Applications/Python\ 3.12/Install\ Certificates.command

Выполнить перезагрузку

После этих действий ошибка перестала возникать после капчи.

Если капча не валидируется: https://github.com/django-recaptcha/django-recaptcha/issues/157?ysclid=lr4rug7g2z266092065

Обход:

class DebugReCaptchaField(ReCaptchaField):

    """

    Дочерняя Капча для работы в DEBUG режиме,

    так как для ReCaptchaField нужен SSL сертификат.

    """

    def clean(self, values):

        if settings.DEBUG:

            if len(values) > 0:

                return values[0]

        return super().clean(values)

Изменен Николай Данилов