【问题标题】:django-nocaptcha-recaptcha always shows additional verification boxdjango-nocaptcha-recaptcha 总是显示额外的验证框
【发布时间】:2015-04-01 17:17:06
【问题描述】:

我安装了django-nocaptcha-recaptcha 并将其集成到我的表单中:

from nocaptcha_recaptcha.fields import NoReCaptchaField

class ClientForm(forms.ModelForm):
    captcha = NoReCaptchaField()

它在表单上显示得很好,但是每当我点击它时,就会弹出一个额外的对话框,要求输入一些文本并进行验证。每次都会发生。我在另一个网络上的另一台计算机上对其进行了测试,单击该框后它仍然要求进行额外的验证。

这就是它的样子:additional verification dialog box

这是我处理表单的方式:

@xframe_options_exempt
def registration(request):           
    if request.method == 'POST':        
        clientform = ClientForm(request.POST)

    # check whether it's valid:
    if clientform.is_valid():
        new_client = clientform.save()
...

我做错了什么? django-nocaptcha-recaptcha 有问题吗?我应该使用其他东西吗?

附:我正在使用 django 1.7.1 和 python 3.4

【问题讨论】:

    标签: django python-3.x recaptcha


    【解决方案1】:

    Another alternative:极简主义和非框架依赖。 这是代码,如果你想重写它。

     '''
        NO-CAPTCHA VERSION: 1.0
        PYTHON VERSION:     3.x
     '''
    
    import json
    from urllib.request import Request, urlopen
    from urllib.parse import urlencode
    
    
    VERIFY_SERVER = "www.google.com"
    
    
    class RecaptchaResponse(object):
    
        def __init__(self, is_valid, error_code=None):
            self.is_valid = is_valid
            self.error_code = error_code
    
        def __repr__(self):
            return "Recaptcha response: %s %s" % (
                self.is_valid, self.error_code)
    
        def __str__(self):
            return self.__repr__()
    
    
    def displayhtml(site_key, language=''):
        """Gets the HTML to display for reCAPTCHA
    
        site_key -- The site key
        language -- The language code for the widget.
        """
    
        return """<script src="https://www.google.com/recaptcha/api.js?hl=%(LanguageCode)s" async="async" defer="defer"></script>
      <div class="g-recaptcha" data-sitekey="%(SiteKey)s"></div>
    """ % {
            'LanguageCode': language,
            'SiteKey': site_key,
        }
    
    
    def submit(response,
               secret_key,
               remote_ip,
               verify_server=VERIFY_SERVER):
        """
        Submits a reCAPTCHA request for verification. Returns RecaptchaResponse
        for the request
    
        response -- The value of response from the form
        secret_key -- your reCAPTCHA secret key
        remote_ip -- the user's ip address
        """
    
        if not(response and len(response)):
            return RecaptchaResponse(is_valid=False, error_code='incorrect-captcha-sol')
    
        def encode_if_necessary(s):
            if isinstance(s, str):
                return s.encode('utf-8')
            return s
    
        params = urlencode({
            'secret': encode_if_necessary(secret_key),
            'remoteip': encode_if_necessary(remote_ip),
            'response': encode_if_necessary(response),
        })
    
        params = params.encode('utf-8')
    
        request = Request(
            url="https://%s/recaptcha/api/siteverify" % verify_server,
            data=params,
            headers={
                "Content-type": "application/x-www-form-urlencoded",
                "User-agent": "reCAPTCHA Python"
            }
        )
        httpresp = urlopen(request)
    
        return_values = json.loads(httpresp.read().decode('utf-8'))
        httpresp.close()
    
        return_code = return_values['success']
    
        if return_code:
            return RecaptchaResponse(is_valid=True)
        else:
            return RecaptchaResponse(is_valid=False, error_code=return_values['error-codes'])
    

    【讨论】:

    • 嗨,Adrian,虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。请看这里:Why and how are some answers deleted?
    【解决方案2】:

    重新启动服务器,不要忘记清除浏览器的缓存。希望这会有所帮助。

    【讨论】:

    • 令人惊讶的是,不知何故奏效了!我昨天也试过了,但是当时没有用。我仍然不明白问题是什么。无论如何,接受答案,因为它有效。
    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多