Evgenii Legotckoi
Evgenii LegotckoiҚыр. 23, 2017, 7: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-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

SB
  • Сәуір 29, 2019, 2:46 Т.Ж.

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

Sergio

Evgenii Legotckoi
  • Сәуір 29, 2019, 3:50 Т.Ж.

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

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

Спасибо.

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

t
  • Ақп. 15, 2021, 3:23 Т.Ж.

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

Evgenii Legotckoi
  • Шілде 2, 2021, 7:25 Т.Ж.

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

t
  • Шілде 2, 2021, 8:20 Т.Ж.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз