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

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

Пікірлер

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

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

  • Нәтиже:84ұпай,
  • Бағалау ұпайлары4
Ua

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

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

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

  • Нәтиже:47ұпай,
  • Бағалау ұпайлары-6
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 10:51 Т.Қ.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚар. 1, 2024, 12:37 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 6:19 Т.Қ.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 5:51 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 9:02 Т.Қ.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
NW
Nayo WaiҚаң. 30, 2025, 8:22 Т.Қ.
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nklyҚаң. 3, 2025, 1:52 Т.Қ.
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
MarselТам. 17, 2023, 12:26 Т.Ж.
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii LegotckoiМаусым 25, 2024, 1:11 Т.Ж.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 5:04 Т.Қ.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]

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