Evgenii Legotckoi
Қыр. 23, 2017, 5:55 Т.Қ.

Django - Оқулық 027. Google reCAPTCHA қосу

Пайдаланушыларды тіркеу кезінде сайтқа reCAPTCHA қосылды және анонимді қолданушылардың кейбір басқа әрекеттері, әйтпесе сайтта тым көп роботтар тіркелген.

reCAPTCHA қосу декоратор функциясы арқылы жасалды, осылайша бұл әдіс сайт көріністері үшін қайта пайдаланылуы мүмкін.

Сайтыңызға reCAPTCHA енгізу үшін reCAPTCHA admin сайтында тіркелу қажет.

Домен ретінде мен сайтты әзірлеп жатқан компьютерімнің жергілікті циклінің IP мекенжайын таңдадым.


Іске асыру

reCAPTCHA енгізу екі қадамнан тұрады:

  1. reCAPTCHA клиенттік жағында, яғни HTML кодында жүзеге асыру
  2. Сервер жағында reCAPTCHA енгізу

Сайтты тіркеу кезінде екі кілт жасалады:

  1. Сайт кілті – HTML бетінде орналасатын кілт
  2. Құпия кілт - Сайт пен Google reCAPTCHA қызметімен байланысу үшін пайдаланылатын кілт

Іске асыру процесі келесідей болады. Пайдаланушы әрекеттерін тексеруді қажет ететін пішіндегі HTML бетінде біз reCAPTCHA сценарийін және сайт кілтін орналастырамыз.

Сервер жағында, егер сіз Django торабында сыныпқа негізделген көріністі пайдалансаңыз, қарау функциясы немесе көрініс сыныбы үшін декораторды енгіземіз. Мен сыныпқа негізделген көріністі қолданамын.

Пішінді толтырған кезде және оның деректерін серверге жіберген кезде, сұраудан captcha тексеру жауабы туралы ақпаратты шығарып алу керек, содан кейін сайтты тексеру және соңғы валидация нәтижесін алу үшін Google серверіне сұрау жіберу керек. Captcha тексеруінің бастапқы нәтижесі бар жауап g-recaptcha-response өрісінде болады. Дәл осы жауап сайтты тексеру және соңғы нәтижені алу үшін Google серверлеріне құпия кілтпен жіберіледі. пайдаланушыны тексеру.

Сұраныс жасау үшін сұраулар кітапханасын қолданамыз.

pip install requests

Декоратор

Құпия кілтті сайт параметрлеріне қойдық, ең оңай нұсқа - оны settings.py ішіне қосу, бірақ ең қауіпсізі емес.

GOOGLE_RECAPTCHA_SECRET_KEY = '6LdqzjEUAAAAAKTDYsfuwZce-oa214GC8QeChVBF'

Содан кейін біз reCAPTCHA декораторын қамтитын decorators.py файлын жасаймыз. Бұл файлды views.py , models.py және т.б. файлдардың жанына орналастырамыз.

from django.conf import settings
from django.contrib import messages

import requests


def check_recaptcha(function):
    def wrap(request, *args, **kwargs):
        request.recaptcha_is_valid = None
        if request.method == 'POST':
            recaptcha_response = request.POST.get('g-recaptcha-response')
            data = {
                'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
                'response': recaptcha_response
            }
            r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
            result = r.json()
            if result['success']:
                request.recaptcha_is_valid = True
            else:
                request.recaptcha_is_valid = False
                messages.error(request, 'Invalid reCAPTCHA. Please try again.')
        return function(request, *args, **kwargs)

    wrap.__doc__ = function.__doc__
    wrap.__name__ = function.__name__
    return wrap

Далле қажетті көріністі декоратормен орап алады:

# -*- coding: utf-8 -*-

from django.conf.urls import url

from . import views
from .decorators import check_recaptcha

app_name = 'registration'
urlpatterns = [
    url(r'^register/$', check_recaptcha(views.RegisterView.as_view()), name='register'),
]

Және көріністің өзінде біз reCAPTCHA жарамдылығын тексереміз. Менің жағдайда бұл FormView сыныбынан мұраланған көрініс болды.

class RegisterView(FormView):
    form_class = UserCreationForm
    template_name = 'register.html'

    def form_valid(self, form):
        # проверка валидности reCAPTCHA
        if self.request.recaptcha_is_valid:
            form.save()
            return render(self.request, 'register_success.html', self.get_context_data())
        return render(self.request, 'register.html', self.get_context_data())

Клиент жағы

Клиент жағында сценарий қосылым кодын, captcha орнын қосу және қате туралы хабарларды көрсету қажет.

{% extends 'base.html' %}
{% block content %}
    <form action="{% url 'register' %}" method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <script src='https://www.google.com/recaptcha/api.js'></script>
        <div class="form-group g-recaptcha" data-sitekey="6LdqzjEUAAAAABRAtK1a3QhIWbn46X_gdcXvhnbG"></div>
        {% if messages %}
            {% for message in messages %}
                {{ message }}
            {% endfor %}
        {% endif %}
        <input type="submit" value="Зарегистрироваться">
    </form>
{% endblock %}

Нәтиже

Нәтижесінде біз Django сайтында reCAPTCHA өте қарапайым іске асуын аламыз.

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

SB
  • Сәуір 29, 2019, 12:46 Т.Қ.

Thank you! Really an elegant and fast solution!
You saved my day, thank again :-)

Sergio

Evgenii Legotckoi
  • Сәуір 29, 2019, 1:50 Т.Қ.

Thank you for feed back. If you will have more questions, you can ask on the forum

V
  • Шілде 4, 2020, 2:34 Т.Қ.

Спасибо.

Только использую декоратор не в urls.py а перед views

t
  • Ақп. 15, 2021, 2:23 Т.Қ.

Добрый день, а эти же действия не подходят для reCHAPTCHA v3?

Evgenii Legotckoi
  • Шілде 2, 2021, 5:25 Т.Қ.

Специально не проверял поддержку для версии 3

t
  • Шілде 2, 2021, 6:20 Т.Қ.

Как проверю напишу:)

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз