Я пытаюсь внедрить 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()}
Есть идеи, как это исправить?