Evgenii Legotckoi
Evgenii Legotckoi23. September 2017 07:55

Django - Tutorial 027. Implementierung Google reCAPTCHA

Bei der Registrierung von Benutzern und einigen anderen Aktionen anonymer Benutzer wurde reCAPTCHA zur Website hinzugefügt, da sonst zu viele Roboter auf der Website registriert sind.

Das Hinzufügen von reCAPTCHA erfolgte über eine Decorator-Funktion, damit diese Methode für Seitenaufrufe wiederverwendet werden kann.

Um reCAPTCHA auf Ihrer Website zu implementieren, müssen Sie Ihre Website im reCAPTCHA Admin registrieren.

Als Domain habe ich die IP-Adresse der Amtsleitung meines PCs gewählt, auf der ich die Seite entwickle.


Implementierung

Die Implementierung von reCAPTCHA besteht aus zwei Schritten:

  1. Implementierung von reCAPTCHA auf der Client-Seite, also im HTML-Code
  2. Implementierung von reCAPTCHA auf der Serverseite

Bei der Registrierung einer Site werden zwei Schlüssel generiert:

  1. Site-Schlüssel – Der Schlüssel, der auf der HTML-Seite platziert wird
  2. Geheimer Schlüssel – Der Schlüssel, der verwendet wird, um die Website und den Google reCAPTCHA-Dienst zu kommunizieren

Der Implementierungsprozess wird wie folgt sein. Auf einer HTML-Seite in einem Formular, das eine Validierung von Benutzeraktionen erfordert, platzieren wir das reCAPTCHA-Skript und den Site-Schlüssel.

Auf der Serverseite fügen wir einen Decorator für die Ansichtsfunktion oder die Ansichtsklasse ein, wenn Sie die klassenbasierte Ansicht auf einer Django-Site verwenden. Ich verwende die klassenbasierte Ansicht.

Wenn Sie das Formular ausfüllen und seine Daten an den Server senden, müssen Sie Informationen über die Captcha-Validierungsantwort aus der Anfrage herausziehen und dann eine Anfrage an den Google-Server senden, um die Website zu überprüfen und das endgültige Validierungsergebnis zu erhalten. Die Antwort mit dem ersten Ergebnis der Captcha-Validierung wird im Feld g-recaptcha-response enthalten sein. Diese Antwort wird mit dem geheimen Schlüssel an die Google-Server gesendet, um die Website zu überprüfen und das Endergebnis zu erhalten Benutzerüberprüfung.

Um eine Anfrage zu erstellen, verwenden wir die requests -Bibliothek.

pip install requests

Dekorateur

Wir fügen den geheimen Schlüssel in Ihre Website-Einstellungen ein. Die einfachste Option besteht darin, ihn zu settings.py hinzuzufügen, obwohl dies nicht die sicherste ist.

GOOGLE_RECAPTCHA_SECRET_KEY = '6LdqzjEUAAAAAKTDYsfuwZce-oa214GC8QeChVBF'

Als Nächstes erstellen wir eine decorators.py -Datei, die den reCAPTCHA-Dekorator enthält. Wir platzieren diese Datei neben den Dateien views.py , models.py usw.

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

Dalle wickelt die notwendige Ansicht mit einem Dekorateur ein:

# -*- 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'),
]

Und in der Ansicht selbst prüfen wir die Gültigkeit von reCAPTCHA. In meinem Fall war dies eine Ansicht, die von der FormView-Klasse geerbt wurde.

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

Clientseite

Auf der Client-Seite müssen Sie den Skript-Verbindungscode und den Speicherort des Captchas hinzufügen und Fehlermeldungen anzeigen.

{% 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 %}

Ergebnis

Als Ergebnis erhalten wir eine ziemlich einfache Implementierung von reCAPTCHA auf einer Django-Site.

Für Django empfehle ich Timeweb-Hoster VDS-Server .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

SB
  • 29. April 2019 02:46

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

Sergio

Evgenii Legotckoi
  • 29. April 2019 03:50

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

V
  • 4. Juli 2020 04:34

Спасибо.

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

t
  • 15. Februar 2021 03:23

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

Evgenii Legotckoi
  • 2. Juli 2021 07:25

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

t
  • 2. Juli 2021 08:20

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

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
A
ALO1ZE19. Oktober 2024 08:19
Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken