Проверка Captcha Python Django

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

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, как проверить, что происходит в фоновом режиме и в какой момент проверка не выполняется?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 370
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы делаете запрос 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.

Привет, спасибо за подсказку. Я изменил это, я также немного изменил код, чтобы он выдавал ответ Google. Я получаю "отсутствующий-ввод-ответ". Кажется, я не могу понять, в какой момент это происходит.

Adam 26.11.2018 14:26

То же сообщение, что и ответ.

Adam 26.11.2018 14:38

согласно документации, похоже, что запрос неверен. Можете ли вы проверить, получает ли captcha_rs надлежащее значение или нет. также я немного обновил свой ответ, проверьте, работает он или нет.

ruddra 26.11.2018 14:45

Привет спасибо за вашу помощь. Я не уверен, как узнать, имеет ли captcha_rs правильное значение. Я не вижу этого в консоли Eclipse. Как бы я это сделал?

Adam 26.11.2018 14:54

просто используйте print(captcha_rs)

ruddra 26.11.2018 14:58

Он печатает это как Нет. Похоже, он не может найти g-recaptcha-response в данных публикации. Я проверил это, и форма возвращает только subject / msg / body и csrf_token.

Adam 26.11.2018 15:19
Ответ принят как подходящий

В порядке. У меня все заработало. Спасибо Руддре за помощь.

Я удалил первый </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 %}

Другие вопросы по теме