Google’s reCAPTCHA это очень популярное решение для защиты вашего сайта от спамеров и ботов. К тому же его довольно дегко настроить и внедрить в проект на Django.
Для начала надо перейти по ссылке https://www.google.com/recaptcha/admin (у вас должен быть аккаунт) и зарегистрировать сайт для получения ключей reCAPTCHA. Процесс описывать не буду, там все понятно и так. Вам понадобятся параметры Secret key
и Public key
.
Теперь в файле настроек settings.py добавьте переменную
GOOGLE_RECAPTCHA_SECRET_KEY = 'Secret key '
Внедрение reCAPTCHA в html код сайта
Для примера используем обычную джанговскую форму и добавим в нее пару строк
{% extends 'base.html' %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<script src='https://www.google.com/recaptcha/api.js'></script>
<div class="g-recaptcha" data-sitekey=" Public key "></div>
<button type="submit" class="btn btn-primary">Post</button>
</form>
{% endblock %}
Уже на даном этапе на странице сайта должна отображаться форма с рекапчей, но работать она пока не может.
Валидация reCAPTCHA
Следующим шагом настроим актуальную валидацию при отправке данных. Это делается при помощи POST запроса по адресу https://www.google.com/recaptcha/api/siteverify, содержащего ваш Secret key и данные с виджета reCAPTCHA в виде g-recaptcha-response
. Код для python3:
views.py
import json
import urllib
from django.shortcuts import render, redirect
from django.conf import settings
from django.contrib import messages
from .models import Comment
from .forms import CommentForm
def comments(request):
comments_list = your.objects.order_by('-created_at')
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
''' Begin reCAPTCHA validation '''
recaptcha_response = request.POST.get('g-recaptcha-response')
url = 'https://www.google.com/recaptcha/api/siteverify'
values = {
'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
'response': recaptcha_response
}
data = urllib.parse.urlencode(values).encode()
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode())
''' End reCAPTCHA validation '''
if result['success']:
form.save()
messages.success(request, 'New comment added with success!')
else:
messages.error(request, 'Invalid reCAPTCHA. Please try again.')
return redirect('comments')
else:
form = CommentForm()
return render(request, 'comments.html', {'comments': comments_list, 'form': form})