Интеграция reCAPTCHA в Django

lepiloff

Nov. 22, 2017, 4:29 p.m.

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})

django