Почему reCaptcha возвращает ошибку timeout-or-duplicate? - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь внедрить Google reCaptcha v2 в форме мастера. Если я заполню капчу и отправлю форму, не заполнив другие поля, она вернет результат:

{'success': True, 'challenge_ts': '2018-10-30T21:47:25Z', 'hostname': '127.0.0.1'}.

Но если я заполню все обязательные поля, чтобы форма была действительной, она вернет результат:

{'success': True, 'challenge_ts': '2018-10-30T21:47:25Z', 'hostname': '127.0.0.1'}.
{'success': False, 'error-codes': ['timeout-or-duplicate']}
[30/Oct/2018 21:47:44] "POST /register/ HTTP/1.1" 200 3912

делает форму недействительной и выдает ошибку с ошибкой. Я предполагаю, что проблема в том, что капча проверяется дважды. Моя логика проверки капчи в чистом виде, поэтому, возможно, в этом проблема:

def clean(self):
    cleaned_data = super(Form, self).clean()
    recaptcha_response = self.request.POST.get('g-recaptcha-response')
    url = 'https://www.google.com/recaptcha/api/siteverify'
    values = {
            'secret': settings.RECAPTCHA_SECRET_KEY,
            'response': recaptcha_response
        }
    data = urllib.parse.urlencode(values).encode()
    req =  urllib.request.Request(url, data=data)
    response = urllib.request.urlopen(req)
    result = json.loads(response.read().decode())
    print (result)
    if result['success']:
        return cleaned_data
    else:
        raise forms.ValidationError('Error.')

Мне интересно, не противоречит ли это моему методу done в представлении:

def done(self, form_list, **kwargs):
    data = {k: v for form in form_list for k, v in form.cleaned_data.items()}

Есть идеи, как это исправить?

...