Django is_authenticated и @login_required не работают

Я попытался сделать некоторые страницы видимыми только при входе в систему.

Я пробовал это с:

 def backend(request):
    if request.user.is_authenticated:
        return render(request, 'web/backend-index.html')
    else:
        return redirect(reverse('web:login'))

а также с:

@login_required
   def backend(request):
   return render(request, 'web/backend-index.html')

Первый код не дает войти.

Второй код не позволяет мне войти в систему, но URL-адрес тоже меняется: http://127.0.0.1:8000/login/?next=/backend/

Если я просто визуализирую представление, не проверяя, вошел ли он в систему, вход в систему работает нормально, и я буду передан на внутреннюю страницу.

Весь код находится на github: https://github.com/psmaster1/BrainSystems/tree/master/smarthome/web

Я не получаю никаких сообщений об ошибках. Просто перенаправляет на страницу авторизации...


person Webbuddy    schedule 17.05.2019    source источник
comment
Ожидается изменение поведения для перенаправления URL-адреса на /login/ и т. д. Вы можете указать представление, на которое хотите перенаправить, в @login_required, но вход не выполняется в этом представлении.   -  person Willem Van Onsem    schedule 17.05.2019
comment
Я не знаю, что вы имеете в виду. Я уже пробовал использовать @login_required(login_url='/login/'), но это не работает. Я знаю, что это не вход в систему автоматически. Если я пытаюсь войти в систему после перенаправления на сайт входа, он просто снова перенаправляется на сайт входа.   -  person Webbuddy    schedule 17.05.2019


Ответы (2)


Ваша форма входа неверна - вот почему вы никогда не аутентифицируетесь. Он отправлял запрос POST на неправильную конечную точку и не отображал фактическую форму. Вот как вы можете рендерить поля вручную

Измените его на это:

<section class="login-form">
    <div class="login-fields">
        <h3>Login</h3>
        <form method="POST">
            {% csrf_token %}

            <div class="form-group">
                {{ login_form.username }}
                <label for="{{ login_form.username.id_for_label }}" class="control-label">Username</label><i class="bar"></i>
                {{ login_form.username.errors }}
            </div>

            <div class="form-group">
                {{ login_form.password }}
                <label for="{{ login_form.password.id_for_label }}" class="control-label">Passwort</label><i class="bar"></i>
                {{ login_form.password.errors }}
            </div>

            <div class="button-container">
                <input type="submit" class="button" value="Login" />
            </div>
        </form>
        <p>Noch nicht Registriert?</p>
        <a href="{% url 'web:register' %}">Registrieren</a>
    </div>
</section>
person Gasanov    schedule 17.05.2019
comment
ХОРОШО. Но тогда я теряю весь свой стиль от формы. Неужели нет другого пути? - person Webbuddy; 17.05.2019
comment
И если я попробую без аутентификации, логин работает. Я тестировал это так: Если user.is_authenticated: ‹p› вошел в систему‹/p› (в файле login.html) - person Webbuddy; 17.05.2019
comment
Этот. Может и action="" поставить на всякий случай, но action="{% url 'web:backend' %}" в любом случае не подходит. Представление входа должно публиковаться в самом себе (так же, как и любое другое представление). - person frnhr; 17.05.2019
comment
Да, это была проблема. Благодарю вас! - person Webbuddy; 17.05.2019

Уже исправил! Проблема заключалась в атрибуте действия в теге формы. Это вызывает проблемы. Просто удалил его из тега формы и сделал редирект в методе login(). Спасибо ребята! :)

person Webbuddy    schedule 17.05.2019
comment
Это то, что я сказал 15 минут назад. - person Gasanov; 17.05.2019
comment
Да, я не видел, чтобы вы удалили тег действия. Благодарю вас! Здесь уже поздно, так что это заняло немного больше времени :D - person Webbuddy; 17.05.2019
comment
Да, я ожидал, что вы просто скопируете и вставите форму, а не преднамеренные поля. Надо было более подробно. В любом случае, пожалуйста, примите ответ согласно справочному центру stackoverflow - person Gasanov; 17.05.2019