Я пытаюсь реализовать reCAPTCHA v3 в моей форме регистрации. Я вижу reCAPTCHA lo go на моей странице регистрации на локальном хосте. Однако, когда я нажимаю «Зарегистрироваться», я получаю эту ошибку:
ValueError at / signup /
Представление account.views.signup не возвращало объект HttpResponse , Вместо этого он вернул None.
Мой код в views.py следующий:
import requests
from django.shortcuts import render, redirect
from django.contrib.auth.models import auth
from django.contrib.auth import get_user_model
from django.contrib.sites.shortcuts import get_current_site
from django.contrib.auth.models import Group
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template.loader import render_to_string
from django.urls import reverse
from django.contrib import messages
from .forms import SignUpForm, LogInForm
from .token_generator import account_activation_token
from django.conf import settings
User = get_user_model()
def signup(request):
form = SignUpForm(request.POST or None)
context = dict(form=form)
if request.method == 'POST':
if form.is_valid():
recaptcha_response = request.POST.get('g-recaptcha-response')
recaptcha_url = 'https://www.google.com/recaptcha/api/siteverify'
data = {
'secret': settings.RECAPTCHA_SECRET_KEY,
'response': recaptcha_response
}
recaptcha_resp = requests.post(recaptcha_url, data=data)
recaptcha_result = recaptcha_resp.json()
if recaptcha_result.get('success'):
user = User.objects.create_user(**form.cleaned_data)
current_site = get_current_site(request)
subject = 'Activate Your MySite Account'
message = render_to_string('accounts/registration/account_activation_email.html', {
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
user.email_user(subject, message)
return redirect(reverse('account_activation_sent'))
else:
messages.error(request, 'Invalid ReCAPTCHA. Please try again.')
else:
return render(request, 'accounts/signup.html', context)
else:
return render(request, 'accounts/signup.html', context)
В моей регистрации. html шаблон, у меня есть следующее:
<form method="post" novalidate="novalidate" class="popup-form">
{{ form.non_field_errors }}
{% csrf_token %}
<label for="{{ form.username.id_for_label }}">Login</label>
{% render_field form.username placeholder="Login" %}
<label for="{{ form.email.id_for_label }}">Email</label>
{% render_field form.email placeholder="Email" %}
{{ form.password.errors }}
<div class="password-above">
<label for="{{ form.password.id_for_label }}">Password</label>
<i class="ion-md-eye show-password js--password-btn"></i>
<i class="ion-md-eye-off hide-password js--password-btn"></i>
</div>
{% render_field form.password placeholder="Password" class="text-pass" %}
<script src='https://www.google.com/recaptcha/api.js?render=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'></script>
<div class="g-recaptcha" data-sitekey="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"></div>
<input type="submit" value="Sign Up">
</form>
Мой бэкэнд-код кажется нормальным, но я мог что-то упустить. Где эти критические проблемы?
PS Регистрация отлично работает без reCAPTCHA, поэтому проблема в коде reCAPTCHA.