考えられる解決策の1つ(リストの最初と3番目の選択肢):
- 特別なログインページ(つまりdefine
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
注意:私はdjangoのビルトインログアウトビューを使用せず、代わりに独自のビューを使用します。ほぼ同じですが、POSTリクエストに対してのみログアウトします。<img src='my_site/logout' />
これにより、ユーザーは悪意のあるコードでログアウトできなくなります。