Одно из возможных решений (первый + третий вариант в вашем списке):
- Вы должны предоставить специальную страницу входа (определите
registration/login.html
).
а для не авторизованного пользователя каждая обычная страница имеет форму входа;
- если пользователь входит в систему нормально (эта логика обрабатывается в
django.contrib.auth.views.login
):
- для обычной страницы: перенаправить пользователя на страницу, с которой он вошел;
- для страницы входа в систему: если есть параметр
next
, перенаправить туда, иначе перенаправить на главную страницу;
- если пользователь не может войти в систему: перенаправить (или перерисовать) страницу входа с предоставленными ошибками;
- если пользователь вошел в систему: обычная страница предоставляет ссылку для выхода из системы (специальная страница все еще существует в случае, если пользователь хочет повторно войти или войти через другую учетную запись).
На обычных страницах форма входа должна выглядеть примерно так: <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
N.B .: Я не использую встроенное представление django для выхода из системы, вместо этого я использую свое собственное: почти то же самое, но выходит из системы только для запросов POST. Это запрещает пользователям выходить из системы с помощью <img src='my_site/logout' />
вредоносного кода.