Есть ли способ обновить существующий csrf_token в Django? - PullRequest
0 голосов
/ 04 апреля 2020

В настоящее время у меня есть следующая форма регистрации в моем приложении django, и у меня возникают проблемы при попытке перезагрузить страницу регистрации, то есть всякий раз, когда пользователь вводит неверное имя пользователя, адрес электронной почты или пароль, он / она получает сообщение об ошибке, но затем, если он / она вводит правильное имя пользователя, адрес электронной почты и пароль, я сталкиваюсь с 403 Forbidden CSRF verification failed. Request aborted. Я полагаю, это происходит потому, что маркер перед сеансом создается, когда пользователь неправильно вводит неверные учетные данные регистрации и когда новые учетные данные затем введите несоответствие между новыми данными и содержимым csrf_token, поэтому я думаю, что мне нужно уничтожить ранее созданный csrf_token и создать новый (пожалуйста, исправьте меня, если я ошибаюсь, поскольку большая часть этого материала для меня относительно новая).

views.py

from django.shortcuts import render, redirect, render_to_response    
from .forms import UserRegisterForm
from django.contrib import messages

def register(request):
    form = UserRegisterForm(request.POST)
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account {username} has been successfully created!')
            return redirect('login')
        else:
            # display the errors when trying to submit your request
            return render_to_response('accounts/register.html', {'form':form})
    elif request.method == 'GET':    
        form = UserRegisterForm()
    return render(request, 'accounts/register.html', {'form': form})


# register.html
 {% block content %}

    {% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}

    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}

{% load static %}

<div class="container"> 
<form method="POST"> {% csrf_token %}
    <div class="wrap-login">

        <div class="bar" >
            Email * <br />
            {{form.email}}
        </div>
        <br />

        <div class="bar">
            Username * <br />
            {{form.username}}
        </div>
        <br />

        <div class="bar">
            Password * <br />
            {{form.password1}}
        </div>
        <br />

        <div class="bar">
            Password confirmation * <br />
            {{form.password2}}
        </div>
        <br />

        <div class="form-group">
            <button class="btn btn-outline-info" type="submit">Sign Up</button>
        </div>

        <small class="text-muted">
            Already have an account?<a class="ml-2" href="/login">Log In</a>
        </small>
    </div>
</form>

Как мне уничтожить предыдущий csrf_token и создать новый? Напомним, что если пользователь вводит правильные учетные данные и затем пытается войти в систему, этот процесс проходит гладко.

Любая помощь или вклад в решение этой проблемы будет принята с благодарностью.

...