【问题标题】:Captcha verification Python Django验证码验证 Python Django
【发布时间】:2018-11-26 23:22:00
【问题描述】:

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

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>

我是 Python 新手,如何检查后台发生的情况以及验证失败的时间点?

【问题讨论】:

    标签: python django captcha


    【解决方案1】:

    您正在发出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
    

    请参阅documentation 了解如何验证验证码。

    【讨论】:

    • 您好,感谢您的提示。我已经改变了,我还稍微改变了一个代码,以便它吐出谷歌的响应。我收到“缺少输入响应”。我似乎无法弄清楚它发生在什么时候。
    • 与响应相同的消息。
    • 根据文档,该请求似乎格式错误。你能检查一下captcha_rs 是否获得了正确的价值。我也稍微更新了我的答案,请检查它是否有效。
    • 您好,感谢您的帮助。我不确定如何查看 captcha_rs 是否具有适当的价值。我在 Eclipse 控制台中看不到它。我该怎么办?
    • 只用print(captcha_rs)
    【解决方案2】:

    好的。 我让它工作了。感谢 Ruddra 的所有帮助。

    我首先删除了&lt;/div&gt;,因为我注意到这是不必要的。这允许 g-recaptcha-response 包含在 POST 数据中。显然,确保您的表单正确且 Google 喜欢它很重要。

    其次,我根据收到的建议对 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')
    

    我的模板:

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

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多