Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证码验证Python Django_Python_Django_Captcha - Fatal编程技术网

验证码验证Python Django

验证码验证Python Django,python,django,captcha,Python,Django,Captcha,我收到以下设置的无效验证码响应。联系人表单工作得非常好,我添加了验证验证码的规则,我检查了密钥,即使解决了它,仍然得到无效的验证码。以下是我的设置: 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]

我收到以下设置的无效验证码响应。联系人表单工作得非常好,我添加了验证验证码的规则,我检查了密钥,即使解决了它,仍然得到无效的验证码。以下是我的设置:

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, ['myemail@gmail.com'],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>
<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 %}

{%csrf_令牌%}

提交

我对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
url=”https://www.google.com/recaptcha/api/siteverify"
headers={'User-Agent':'DebuguearApi浏览器',}
params={'secret':settings.repactcha_secret_KEY,'response':captcha_rs}
验证_rs=requests.post(url,data=params,headers=headers)#Ok。
我让它工作了。谢谢鲁德拉的帮助

我先删除了
,因为我注意到这是不必要的。这允许在POST数据中包含g-recaptcha-response。显然,重要的是要确保你的表单是正确的,并且谷歌喜欢它

其次,我根据收到的建议对main 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@gmail.com'],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')
我的模板:

 <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>
<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 %}

{%csrf_令牌%}

提交 {消息%中的消息为%s} {{message}} {%endfor%}
嗨,谢谢你的提示。我改变了这一点,我也改变了一点代码,这样它就可以吐出谷歌的回应。我得到“缺少输入响应”。我似乎无法确定它发生在哪一点。消息与响应相同。根据文档,请求的格式似乎不正确。您能否检查验证码是否得到正确的值。另外,我已经稍微更新了我的答案,请检查它是否有效。嗨,谢谢你的帮助。我不知道如何查看验证码是否有正确的值。我没有在Eclipse控制台中看到它。我该怎么做?只需使用
print(验证码)