Django 403 Запрещено CSRF - PullRequest
       3

Django 403 Запрещено CSRF

1 голос
/ 20 марта 2020

недавно я вижу странную ошибку в моем Django приложении. Когда я пытаюсь войти в систему, Chrome застревает на «Обработка запроса». После того, как я снова нажму кнопку входа, появится ошибка 403 Forbidden CSRF. Однако, когда я нажимаю кнопку «Назад» и снова нажимаю «Войти» с теми же учетными данными, он успешно входит в систему. Я не знаю, почему это происходит. У меня есть два Django приложения, которые «домашнее» и «основное», после правильных учетных данных пользователь должен перейти к просмотру «домашних» приложений.

My main / user_login. html

<form method="POST" action="{%url 'main:user_login' %}" class="form-signin">
                {% csrf_token %}
                <div class="form-label-group">
                  <input type="text" name="username" id="inputText" class="form-control" placeholder="Username" required autofocus>
                  <br/>
                </div>
                <div class="form-label-group">
                 <input type="password"  name="password" id="inputPassword" class="form-control" placeholder="Password" required>   
                </div>
                <div class="custom-control custom-checkbox mb-3">
                  <input type="checkbox" class="custom-control-input" id="customCheck1">
                  <label class="custom-control-label" for="customCheck1">Remember password</label>
                </div>
                <input type="submit" class="form-control" name="" value="Login">
                <hr class="my-4">
                <p>Don't have account? <a href="{% url 'main:signup' %}" id="signup">Sign up here</a></p>
                {% if message %}<p style="color: red;">{{ message }}</p>{% endif %}
                <a href="{% url 'password_reset' %}" id="signup">Forgot Password</a>
              </form>

my main / views.py:

def user_login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            user = authenticate(username=username, password=password)
            if user is not None:              
                login(request,user)
                messages.info(request, "Successfully signed in")
                return redirect(reverse('home:home')) 
            else:
                message = 'Sorry, the username or password you entered is not valid please try again.'
                return render(request, 'home/user_login.html', {'message':message})
        else:
            message = 'Sorry, the username or password you entered is not valid please try again.'
            return render(request, 'home/user_login.html', {'message':message})
    else:
        form=AuthenticationForm()
        return render(request, 'home/user_login.html', {"form":form})

my home / views.py:

@ login_required

def home(request):
    context = {
        'posts': Post.objects.all()
    }
    return render(request, 'home/home.html', context)

Я не понимаю что является причиной проблемы, которая, как я упоминал ранее, после возвращения и повторного нажатия на кнопку входа в систему пользователь может успешно войти в систему.

Заранее спасибо!

Редактировать: я понял, что вызывает ошибку это это оператор else, который выдает сообщение об ошибке. Я изменил свое мнение прямо сейчас, это не дает мне ошибку, но я должен нажать на кнопку входа дважды, иначе это застрянет снова. Мой взгляд теперь:

def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            return redirect('home:home')

        else:
            messages.error(request,'Sorry, the username or password you entered is not valid please try again.')
            return HttpResponseRedirect('/')
    else:
        form=AuthenticationForm()
        return render(request, 'main/user_login.html', {"form":form})

И мой user_login. html сейчас:

      <form method="POST" action="{% url 'main:user_login' %}" class="form-signin">
        {% csrf_token %}
        <div class="form-label-group">
          <input type="text" name="username" id="inputText" class="form-control" placeholder="Username" required autofocus>
          <br/>
        </div>
        <div class="form-label-group">
         <input type="password"  name="password" id="inputPassword" class="form-control" placeholder="Password" required>   
        </div>
        <div class="custom-control custom-checkbox mb-3">
          <input type="checkbox" class="custom-control-input" id="customCheck1">
          <label class="custom-control-label" for="customCheck1">Remember password</label>
        </div>
        <input type="submit" class="form-control" name="" value="Login">
        <hr class="my-4">
        <p>Don't have account? <a href="{% url 'main:signup' %}" id="signup">Sign up here</a></p>
        {% for message in messages %}
          <p style="color: red;">{{ message }}</p>
        {% endfor %}
        <a href="{% url 'password_reset' %}" id="signup">Forgot Password</a>
      </form>

Это вызывает проблему:

 else:
     messages.error(request,'Sorry, the username or password you entered is not valid please try again.')
     return HttpResponseRedirect('/')

Ответы [ 3 ]

0 голосов
/ 20 марта 2020

Я думаю, что проблема может быть в блоке else.

Просто попробуйте это:

def user_login(request):
  if request.method == 'POST':
    form = AuthenticationForm(request, data=request.POST)
    if form.is_valid():
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:              
            login(request,user)
            messages.info(request, "Successfully signed in")
            return redirect(reverse('home:home')) 

    else:
        message = 'Sorry, the username or password you entered is not valid please try again.'
        return render(request, 'home/user_login.html', {'message':message})
else:
    form=AuthenticationForm()
    return render(request, 'home/user_login.html', {"form":form})
0 голосов
/ 21 марта 2020

Django встроенные теги нужны пробелы

исправьте это в вашей форме: action="{% url 'main:user_login' %}"

0 голосов
/ 20 марта 2020

Попробуйте это:

@login_required
def home(request):
     post = Post.objects.all()
     context = {'post':post}
     return render(request, 'home/home.html', context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...