1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Django ログイン・ログアウト機能を設定してみる

Posted at

問題の発生

Djangoにログイン・ログアウト機能をつけたい!
まとめてみることにした。

参考

必要な設定

・ルーティング
・テンプレートの作成
・ログアウト機能の追加

ルーティング

・既にあるアプリのurls.pyにログインとログアウトのURLを設定

urls.py
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('',views.TopViews.as_view(), name = 'top'),
    path('login/', auth_views.LoginView.as_view(), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name='logout'),
]

あらかじめdjangoで設定されているLoginViewLogoutViewを設定しているため、ログイン機能を実装できる。

・settings.pyにリダイレクト先の設定
今回、ログイン後は「...8000/」の画面URLに移動するようしたいため、LOGIN_REDIRECT_URL = '/' とした。

settings.py
LOGIN_URL = '/login'             # ログインが必要なときのリダイレクト先
LOGIN_REDIRECT_URL = '/'         # ログイン成功後のリダイレクト先
LOGOUT_REDIRECT_URL = '/login'   # ログアウト後のリダイレクト先

テンプレートの作成

ログイン機能を持つテンプレートを作成するときは、以下の2つに注意する。
・registration/login.htmlとしてテンプレートを作成する。
・inputのnameにusernameとpasswordの値を設定する

login.html
<form method="post">
    {% csrf_token %}
    <div>
        <label for="id_username">Username:</label>
        <input type="text" name="username" id="id_username" required>
    </div>
    <div>
        <label for="id_password">Password:</label>
        <input type="password" name="password" id="id_password" required>
    </div>
    <button type="submit">Login</button>
</form>

なぜ、上記2つの設定が必要なのか

結論:LoginViewやLogoutViewを見てみると、以上の2つのような設定にしろと制定されているから。
詳細:loginやlogoutのルーティングが呼び出された際、
auth_views.LoginView.as_view()auth_views.LogoutView.as_view()それぞれのviewが呼び出されるよう設定した。例えば、LoginViewの中身を見てみると、以下のような形になっている。※中身を見たい場合はfrom django.contrib.auth import views as auth_viewsを参考にして追っていけば良い。「djangoフォルダ➝contribファイル➝viewsクラス」のように。Django公式の認証システムのドキュメントリンク

.LoginView
class LoginView(SuccessURLAllowedHostsMixin, FormView):
                "~中略~"
    authentication_form = None
    redirect_field_name = REDIRECT_FIELD_NAME
    template_name = 'registration/login.html'
    ...

ここでtemplate_name = 'registration/login.html'となっている(テンプレート名はregistrationフォルダのlogin.htmlというファイル名にしてくださいよーとなっている)
input指定は長すぎて追えなかったのでそういうもんだと理解することにした、。(こういうのも大事だよね・・・?)

ログアウト

ルーティングの章でpath('logout/', auth_views.LogoutView.as_view(), name='logout'),を設定しているので、LogoutViewが使用できるようになっているので、aタグにlogoutのURLを指定すればログアウトできる。

<a class="nav-item nav-link " href="{% url 'logout' %}">ログアウト</a>

学んだこと

DjangoのLoginViewLogoutViewを使うことで、簡単にログイン・ログアウト機能を実装できる。ポイントは以下の通り
・settings.pyにログイン・ログアウト後のリダイレクト先を設定
・ルーティングを行って、LoginViewとLogoutViewを参照するようにする
・LoginViewとLogoutViewはDjangoのあらかじめ設定されているクラスで、ログイン機能を管理するクラスになっている。
・ログイン用のテンプレートとして、'registration/login.html'でテンプレートを設定する。

初学者の参考になれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?