Skip to content

Instantly share code, notes, and snippets.

@NotKit
Created May 31, 2016 15:22
Show Gist options
  • Save NotKit/35e4ade5fe54d08f4ad9b46caeb7ba4e to your computer and use it in GitHub Desktop.
Save NotKit/35e4ade5fe54d08f4ad9b46caeb7ba4e to your computer and use it in GitHub Desktop.
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