【问题标题】:New Google ReCAPTCHA with django-recaptcha带有 django-recaptcha 的新 Google ReCAPTCHA
【发布时间】:2015-02-22 12:44:14
【问题描述】:

是否有一种简单的方法可以调整 django-recaptcha 插件以使用新的 google re-captcha API? 我已经更改了模板,并且验证码以写入方式显示,但验证不起作用。有谁知道如何以简单的方式解决此问题?

【问题讨论】:

  • 已经找到另一个插件:django-nocaptcha-recaptcha

标签: python django plugins django-recaptcha


【解决方案1】:

或者自己制作:这是我的,我使用其他人作为模板/起点制作的。

import json
import urllib2, urllib

API_SERVER = "https://www.google.com/recaptcha/api/siteverify"


class  RecaptchaResponse(object):
    def __init__(self, is_valid, error_code=None):
        self.is_valid = is_valid
        self.error_code = error_code

    def __unicode__(self):
        print "%s, %s" % (self.is_valid, self.error_code)

    def __str__(self):
        return self.__unicode__()

    def get_error(self):
        if self.error_code and len(self.error_code):
            return self.error_code[0]


def submit(recaptcha_secret, recaptcha_response, remoteip=''):

    if not (recaptcha_secret and recaptcha_response and len(recaptcha_secret) and len(recaptcha_response) ):
        return RecaptchaResponse(is_valid=False, error_code='incorrect-captcha-sol')

    def encode_if_necessary(s):
        if isinstance(s, unicode):
            return s.encode('utf-8')
        return s

    params = urllib.urlencode({
        'secret': encode_if_necessary(recaptcha_secret),
        'response': encode_if_necessary(recaptcha_response),
        'remoteip': encode_if_necessary(remoteip)
    })

    request = urllib2.Request(
        url=API_SERVER,
        data=params,
        headers={
            "Content-type": "application/x-www-form-urlencoded",
            "User-agent": "reCAPTCHA Python"
        }
    )

    httpresp = urllib2.urlopen(request)
    return_values = json.loads(httpresp.read())
    print return_values

    if return_values.get('success', False):
        return RecaptchaResponse(is_valid=True)
    else:
        return RecaptchaResponse(is_valid=False, error_code=return_values.get('error-codes', ''))

【讨论】:

    【解决方案2】:

    移植到 Python 3 的相同代码。我们正在生产中使用它。如果您愿意,can be dowloaded from pypi/pip

     '''
        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'])
    

    【讨论】:

      【解决方案3】:

      我知道你的问题很老,但现在,你只需要在 settings.py 中写:

      NOCAPTCHA = True
      

      就是这样。

      【讨论】:

        猜你喜欢
        • 2020-02-16
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        • 2022-01-19
        • 2015-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        相关资源
        最近更新 更多