Попытка сделать Check reCaptcha Mixin для входа в систему - django - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать миксин, который проверит действительность reCaptcha. Я новичок в Django, я пытался сделать это с тем, что я знаю

Проверка выполняется правильно, но проблема в разрешении. Когда он снова перенаправляет меня на страницу входа, он проходит аутентификацию и перенаправляет на Dashboard, значит страница успеха.

Посмотрите на миксин.

class CheckRecaptchaMixin(AccessMixin):

    error_message = 'Invalid reCAPTCHA. Please try again.'

    def get_error_message(self):
        return self.error_message

    def handle_not_valid_recaptcha(self):

        message = self.get_error_message()
        if self.raise_exception:
            raise PermissionDenied(message)
        messages.error(self.request, message)
        print('login redirect')
        return redirect_to_login(self.request.get_full_path(), self.get_login_url(), self.get_redirect_field_name())


    def dispatch(self,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']:
                print('This is success')
                request.recaptcha_is_valid = True
            else:
                print('This is error')
                request.recaptcha_is_valid = False
                self.handle_not_valid_recaptcha()

        return super(CheckRecaptchaMixin, self).dispatch(request,*args, **kwargs)

В моих views.py

class UserLoginView(CheckRecaptchaMixin,LoginView):
   template_name = 'accounts/login.html'
   redirect_field_name='next'

Когда reCaptcha правильно, он печатает только This is success, а когда reCaptcha неправильно, он печатает This is error и login redirect.

Это означает, что он успешно обрабатывает reCaptcha, но не перенаправляет на страницу входа, и еще одна важная вещь, которую я должен заметить, на моей странице выхода из системы, я вижу error_message, который я определил в mixin ('Invalid reCAPTCHA. Пожалуйста, повторите попытку.')

1 Ответ

0 голосов
/ 06 июля 2018

То, что я сделал для того, чтобы не пройти аутентификацию, это добавить ошибку в форму методом get_form, здесь работает mixin.

class CheckRecaptchaMixin(AccessMixin):

    error_message = 'Invalid reCAPTCHA. Please try again.'
    not_activated_redirect = ''
    def get_error_message(self):
        return self.error_message

    def dispatch(self,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

        return super(CheckRecaptchaMixin, self).dispatch(request,*args, **kwargs)

    def get_form(self,form_class=None):
        form = super().get_form(form_class)
        if self.request.method == 'POST' and form.is_valid():
            if not self.request.recaptcha_is_valid:
                form.add_error(None,self.get_error_message())
        return form

Если у кого-то есть лучший вариант, он / она может ответить мне, спасибо.

...