Created
May 31, 2016 15:22
-
-
Save NotKit/35e4ade5fe54d08f4ad9b46caeb7ba4e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import logging | |
from django.conf import settings | |
from django import forms | |
from django.utils.safestring import mark_safe | |
from django.utils.translation import ugettext_lazy as _ | |
from six.moves.urllib.request import urlopen | |
from six.moves.urllib.parse import urlencode | |
from six.moves.urllib.error import URLError | |
class gReCaptcha(forms.widgets.Widget): | |
recaptcha_response_name = 'g-recaptcha-response' | |
recaptcha_html = (u'<script src="https://www.google.com/recaptcha/api.js" async defer></script>' | |
'<div class="g-recaptcha" data-sitekey="{key}"></div>') | |
def render(self, name, value, attrs=None): | |
return mark_safe(self.recaptcha_html.format(key=settings.RECAPTCHA_V2_PUBLIC_KEY)) | |
def value_from_datadict(self, data, files, name): | |
return data.get(self.recaptcha_response_name, None) | |
class gReCaptchaField(forms.CharField): | |
default_error_messages = { | |
'captcha_invalid': _(u'Invalid captcha'), | |
'connection_error': _(u"Can't connect to reCAPTCHA server"), | |
} | |
verify_url = 'https://www.google.com/recaptcha/api/siteverify?{}' | |
def __init__(self, *args, **kwargs): | |
self.widget = gReCaptcha | |
self.required = True | |
super(gReCaptchaField, self).__init__(*args, **kwargs) | |
def clean(self, value): | |
super(gReCaptchaField, self).clean(value) | |
data = urlencode([('secret', settings.RECAPTCHA_V2_PRIVATE_KEY), ('response', value)]) | |
try: | |
response = urlopen(self.verify_url.format(data)).read() | |
except URLError: | |
logger.exception("Can't connect to reCAPTCHA server to verify user response") | |
raise forms.ValidationError(self.error_messages['connection_error']) | |
check_captcha = json.loads(response.decode('utf-8')) | |
if not check_captcha['success']: | |
raise forms.ValidationError(self.error_messages['captcha_invalid']) | |
return value |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment