Трудно помочь напрямую, так как вы не упомянули, какую библиотеку вы пытались использовать.Вот мой подход к добавлению recaptcha v2 к входу в Django, дополнительные библиотеки не требуются.
В этом примере я добавляю скрипт recaptcha в шаблон входа в django и переопределяю представление входа в приложение django auth, чтобырасширить его функциональность таким образом, чтобы он проверял серверную часть recaptcha (с соответствующим RECAPTCHA_SECRET согласно google docs ).
Также обратите внимание, что context_processor используется для вставки RECAPTCHA_SITE_KEY в шаблон входа в систему.
login.html
...
<head>
<script src="https://www.google.com/recaptcha/api.js" async defer</script>
<script>
function onSubmit(token) {
document.getElementById("theForm").submit();
}
</script>
</head>
<body>
<form id="theForm">
<button class="g-recaptcha btn btn-primary"
data-callback="onSubmit"
data-sitekey="{{RECAPTCHA_SITE_KEY}}"
type="submit">Login
</button>
</form>
</body>
...
url.py
...
# overriding auth app endpoint
url(r'^accounts/login/', MyLoginView.as_view(), name='login'),
...
context_processor.py
from django.conf import settings
def recaptcha_site_key(request):
return {'RECAPTCHA_SITE_KEY': settings.RECAPTCHA_SITE_KEY}
settings.py
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'yourapp.context_processors.recaptcha_site_key',
...
],
},
},
]
MyLoginView.py
from django.contrib.auth import views as auth_views
def _validate_recaptcha(token, ip):
# implement server side validation according to google docs
pass
class MyLoginView(auth_views.LoginView):
'''Use django login flow, with added logic for google recaptcha
'''
def form_valid(self, form):
request_body = self.request.POST
if not request_body:
return None
recaptcha_token = request_body['g-recaptcha-response']
ip_addr, _ = get_client_ip(self.request)
if not _validate_recaptcha(recaptcha_token, ip_addr):
# your logic
return redirect('login')
return super().form_valid(form)