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 Т.Ж.

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

Пікірлер

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

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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