- 1. Іске асыру
- 1. Декоратор
- 2. Клиент жағы
- 2. Нәтиже
Пайдаланушыларды тіркеу кезінде сайтқа reCAPTCHA қосылды және анонимді қолданушылардың кейбір басқа әрекеттері, әйтпесе сайтта тым көп роботтар тіркелген.
reCAPTCHA қосу декоратор функциясы арқылы жасалды, осылайша бұл әдіс сайт көріністері үшін қайта пайдаланылуы мүмкін.
Сайтыңызға reCAPTCHA енгізу үшін reCAPTCHA admin сайтында тіркелу қажет.
Домен ретінде мен сайтты әзірлеп жатқан компьютерімнің жергілікті циклінің IP мекенжайын таңдадым.
Іске асыру
reCAPTCHA енгізу екі қадамнан тұрады:
- reCAPTCHA клиенттік жағында, яғни HTML кодында жүзеге асыру
- Сервер жағында reCAPTCHA енгізу
Сайтты тіркеу кезінде екі кілт жасалады:
- Сайт кілті – HTML бетінде орналасатын кілт
- Құпия кілт - Сайт пен 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-сервері ұсынамын.
Thank you! Really an elegant and fast solution!
You saved my day, thank again :-)
Sergio
Thank you for feed back. If you will have more questions, you can ask on the forum
Спасибо.
Только использую декоратор не в urls.py а перед views
Добрый день, а эти же действия не подходят для reCHAPTCHA v3?
Специально не проверял поддержку для версии 3
Как проверю напишу:)