Я получаю неверный ответ на ввод кода для настройки ниже. Контактная форма работала отлично, я добавил правило, которое проверяет капчу, я проверил секретные ключи и все еще получаю недействительную капчу даже после ее решения. Ниже моя установка:
views.py
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def grecaptcha_verify(request):
response = {}
data = request.POST
captcha_rs = data.get('g-recaptcha-response')
url = "https://www.google.com/recaptcha/api/siteverify"
params = {
'secret': settings.RECAPTCHA_SECRET_KEY,
'response': captcha_rs,
'remoteip': get_client_ip(request)
}
verify_rs = requests.get(url, params=params, verify=True)
verify_rs = verify_rs.json()
response["status"] = verify_rs.get("success", False)
response['message'] = verify_rs.get('error-codes', None) or "Unspecified error."
return response
def contact(request):
if request.method == 'POST':
if grecaptcha_verify(request) == "success":
subject = request.POST.get('subject')
message = request.POST.get('message')
email = request.POST.get('email')
if subject and message and email:
try:
send_mail(subject, message, email, ['[email protected]'],fail_silently= True)
except BadHeaderError:
return HttpResponse('{Bad Header}')
return greatsuccess(request)
else:
return HttpResponse('{Invalid Form}')
else:
return HttpResponse('Invalid Captcha')
return render(request, 'personal/contact.html')
Мой шаблон:
<div class = "form-area">
<form role = "form" method = "POST">
{% csrf_token %}
<input type = "text" class = "form-control" id = "subject" name = "subject" placeholder = "Subject" maxlength = "70" required>
</div>
<br>
<div class = "form-group">
<input type = "email" class = "form-control" id = "email" name = "email" placeholder = "Email" required>
</div>
<div class = "form-group">
<textarea class = "form-control" type = "textarea" id = "message" name = "message" placeholder = "Message" maxlength = "300" rows = "7"></textarea>
</div>
<button type = "submit" name = "submit" class = "btn btn-m btn-secondary">Submit</button>
<script src='https://www.google.com/recaptcha/api.js'></script>
<div class = "g-recaptcha" data-sitekey = "MYKEY"></div>
</form>
Я новичок в Python, как проверить, что происходит в фоновом режиме и в какой момент проверка не выполняется?






Вы делаете запрос get на верификацию, но вам нужно сделать запрос post к нему. Вот почему не проходит проверка по капче. Так что попробуйте вот так:
url = "https://www.google.com/recaptcha/api/siteverify"
headers = {'User-Agent': 'DebuguearApi-Browser',}
params = {'secret': settings.RECAPTCHA_SECRET_KEY, 'response': captcha_rs}
verify_rs = requests.post(url, data=params, headers=headers) # <-- Update Here
... # rest of your code
См. документация о том, как проверить recaptcha.
То же сообщение, что и ответ.
согласно документации, похоже, что запрос неверен. Можете ли вы проверить, получает ли captcha_rs надлежащее значение или нет. также я немного обновил свой ответ, проверьте, работает он или нет.
Привет спасибо за вашу помощь. Я не уверен, как узнать, имеет ли captcha_rs правильное значение. Я не вижу этого в консоли Eclipse. Как бы я это сделал?
просто используйте print(captcha_rs)
Он печатает это как Нет. Похоже, он не может найти g-recaptcha-response в данных публикации. Я проверил это, и форма возвращает только subject / msg / body и csrf_token.
В порядке. У меня все заработало. Спасибо Руддре за помощь.
Я удалил первый </div>, так как заметил, что в этом нет необходимости. Это позволило включить g-recaptcha-response в данные POST. Очевидно, важно убедиться, что ваша форма верна и нравится Google.
Во-вторых, я внес некоторые изменения в основной файл views.py в соответствии с полученным советом + некоторые улучшения.
def greatsuccess(request):
messages.success(request, "Email sent!")
return render(request, 'personal/contact.html')
def greatfail(request):
messages.error(request, "Invalid Captcha!")
return render(request, 'personal/contact.html')
def grecaptcha_verify(request):
data = request.POST
captcha_rs = data.get('g-recaptcha-response')
url = "https://www.google.com/recaptcha/api/siteverify"
headers = {'User-Agent': 'DebuguearApi-Browser',}
params = {'secret': settings.RECAPTCHA_SECRET_KEY, 'response': captcha_rs}
verify_rs = requests.post(url,params, headers=headers)
verify_rs = verify_rs.json()
response = verify_rs.get("success", False)
return response
def contact(request):
if request.method == 'POST':
response=grecaptcha_verify(request)
if response == True :
subject = request.POST.get('subject')
message = request.POST.get('message')
email = request.POST.get('email')
if subject and message and email:
try:
send_mail('Sent from mywebsite '+subject, message, email, ['[email protected]'],fail_silently= True)
except BadHeaderError:
return HttpResponse('{Bad Header}')
return greatsuccess(request)
else:
return HttpResponse('{Invalid Form}')
else:
greatfail(request)
return render(request, 'personal/contact.html')
Мой шаблон:
<form method = "POST">
{% csrf_token %}
<input type = "text" class = "form-control" id = "subject" name = "subject" placeholder = "Subject" maxlength = "70" required>
<br>
<div class = "form-group">
<input type = "email" class = "form-control" id = "email" name = "email" placeholder = "Email" required>
</div>
<div class = "form-group">
<textarea class = "form-control" type = "textarea" id = "message" name = "message" placeholder = "Message" maxlength = "300" rows = "7"></textarea>
</div>
<div class = "g-recaptcha" data-sitekey = "key"></div>
<button type = "submit" name = "submit" class = "btn btn-m btn-secondary">Submit</button>
</form>
{% for message in messages %}
{{ message }}
{% endfor %}
Привет, спасибо за подсказку. Я изменил это, я также немного изменил код, чтобы он выдавал ответ Google. Я получаю "отсутствующий-ввод-ответ". Кажется, я не могу понять, в какой момент это происходит.