Встроенный вид входа в систему Django и ошибки

Я использую представления django.contrib.auth.views.login and .logout. Очень удобно, работает из коробки, развернул бы снова ААА+ и т.д.

Проблема возникает из-за того, что я не использую отдельную страницу входа в систему, а имею окно входа в систему на каждой странице (если, конечно, пользователь не вошел в систему). И так, когда комбинация имени пользователя и пароля неверна, я получаю сообщение об ошибке. Какой из этих трех путей мне выбрать?

  • Существует секретный способ перенаправления на следующий не только в случае успеха, но и в случае ошибки. Если это так, пожалуйста, скажите мне!
  • Я пишу свое собственное представление входа в систему, тем временем используя систему сообщений Django.
  • Я пишу страницу входа (ну, просто отсутствует шаблон), чтобы я мог использовать все возможности системы аутентификации Django.

person Agos    schedule 01.12.2010    source источник
comment
Я получаю сообщение об ошибке с сообщением об отсутствии шаблона registration/login.html.   -  person Agos    schedule 02.12.2010


Ответы (1)


Одно из возможных решений (первый + третий варианты в вашем списке):

  1. Вы должны предоставить специальную страницу входа (то есть определить registration/login.html), а для незарегистрированного пользователя каждая обычная страница имеет форму входа;
  2. if user logins normally (this logic handled in django.contrib.auth.views.login):
    • for normal page: redirect user to the page from where she loged in;
    • для страницы входа: если есть параметр next, перенаправить туда, иначе перенаправить на главную страницу;
  3. если пользователь не может войти в систему: перенаправить (или перерисовать) страницу входа с указанными ошибками;
  4. если пользователь вошел в систему: обычная страница предоставляет ссылку для выхода из системы (специальная страница все еще существует на случай, если пользователь хочет повторно войти в систему или войти через другую учетную запись).

На обычных страницах форма входа должна иметь что-то вроде этого <input type="hidden" name="next" value="{{ request.path }}" />.

В настройках проекта:

# in settings.py
LOGIN_URL = '/login'     # this should coinside with url pattern of login view
LOGOUT_URL = '/logout'   # same but for logout view
LOGIN_REDIRECT_URL = '/' # url to main page

NB: я не использую представление выхода из системы django, вместо этого я использую свое собственное: почти то же самое, но выход из системы только для запросов POST. Это запрещает пользователям выходить из системы с помощью <img src='my_site/logout' /> вредоносного кода.

person user461342    schedule 01.12.2010
comment
Спасибо за очень подробный ответ. Теперь я склонен предоставить шаблон страницы входа, но у меня есть несколько дополнительных вопросов: я предполагаю, что на отдельной странице входа следующий параметр устанавливается только в том случае, если я попал туда из-за неудачного входа из другого места. Я получаю доступ к нему через request.post.next, верно? Последний вопрос: как передаются ошибки входа? Передаются ли они как ошибки в форме? - person Agos; 02.12.2010
comment
Кроме того: я уже позаботился о включении request.path в следующий раз, но спасибо за предупреждение о вредоносном коде! - person Agos; 02.12.2010
comment
Нет, пользователь может перейти на отдельную страницу входа и иметь next даже в обычном случае: например, вы можете указать ссылку для входа в систему, например my_site/login?next=${some other page path}. Представление django.contrib.auth.views.login обрабатывает эти случаи + предоставляет next переменную для шаблона. Ошибки, переданные как поля ошибок в объекте формы. - person user461342; 02.12.2010