Python 3.6 / Django 2.1.4: «регистрация с уже существующим именем пользователя / электронная почта нарушает CSRF_TOKEN» - PullRequest
0 голосов
/ 13 декабря 2018

Я проводил некоторые тесты в Django, чтобы увидеть, вызывает ли form.errors все типы ошибок в форме (что и делает).

Теперь вот, где дела пошли на юг:

Еслия пытаюсь зарегистрироваться с существующим адресом электронной почты / именем пользователя (просто проверяя эффективность) более одного раза, я получаю это

Forbidden (403)
CSRF verification failed. Request aborted.

Help text : (all those conditions are met.)

Я думаю, что эти тесты ломают csrf_token.

Такя не знаю, исходит ли проблема из моего кода или csrf_token просто выполняет свою работу, защищая владельца этого имени пользователя / адреса электронной почты.

Кто-нибудь сталкивался с подобной проблемой раньше??

Просмотр регистрации

class SignUp(View):

    def get(self, request):
        form = MyModelCreation()
        return render(
            request,
            'signup.html',
            {'form': form}
        )

    def post(self, request):
        form = MyModelCreation(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False  # Create an inactive user
            user.save()

            # Send a confirmation Email
            # Generate a token for the new user --tokens.py--
            current_site = get_current_site(request)
            mail_subject = 'Activate your profile account.'
            message = render_to_string('account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),
                'token': user_token.make_token(user),
            })
            receiver = form.cleaned_data.get('email')
            email = EmailMessage(
                mail_subject, message, to=[receiver]
            )
            email.send()
            return redirect("account_activation_sent")
        else:
            return render_to_response(
                   'signup.html', 
                   {"form": form}, 
                   RequestContext(request)
                   )

Шаблон регистрации

{% extends 'base_test.html' %}
{% block title %}My Site | Sign Up{% endblock title %}
{% block content %}
<div class="padding">
  <h2>Sign up : <small>*ALL FIELDS ARE REQUIRED</small></h2>
  <form method="post" class="form">
    {% csrf_token %}
    {% for field in form %}
      <p>
        {{ field.label_tag }}<br>
        {{ field }}
        {% for error in field.errors %}
          <p style="color: red">{{ error }}</p>
        {% endfor %}
      </p>
    {% endfor %}
    <button class="btn btn-primary btn-lg" type="submit">Sign up</button>
  </form>
</div>
{% endblock %}

1 Ответ

0 голосов
/ 13 декабря 2018

Я исправил это, переключившись обратно на render (), я думаю, что render_to_response () требует дополнительных данных, о которых я не знаю.

return render(request, 'signup.html', {'form': form})

Спасибо!

...