Ошибка reCAPTCHA v3 в Django: Представление account.views.signup не возвращало объект HttpResponse. Вместо этого он вернулся - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь реализовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...