スポンサードリンク



こんにちは。sinyです。

この記事では、Djangoのユーザセッション管理機能の実装事例についてご紹介します。

通常のユーザ認証機能の実装

まずは、通常のDjangoユーザ認証の実装を行います。

settings.pyの設定

まずは、認証系に必要なsettngis.pyの設定を追加します。

 

パラメータ 説明

LOGIN_URL

ログオンが必要なページに認証していないユーザがアクセスした場合にリダイレクトするURLを指定

LOGIN_REDIRECT_URL

ログオン後にリダイレクトされるURLを指定

LOGOUT_REDIRECT_URL

ログアウト後にリダイレクトされるURLを指定

ユーザ認証用アプリケーションの作成

以下のコマンドでユーザ認証用に新規アプリケーション(accounts)を作成します。

 

また、settings.pyのINSTALLED_APPに「 'accounts.apps.AccountsConfig',」を追加しておきます。

urls.pyの設定

まず、プロジェクト直下のurls.pyを以下の通り設定します。

 

続いて、accountsアプリケーション直下のurls.pyを以下の通り設定します。

  • 4行目:accountsアプリケーションのURLの名前空間名を指定しています。
  • 7行目:ログオン認証画面用のURLパターンを定義しています。(http://127.0.0.1/login)
  • 8行目:ログアウト用のURLパターンを定義しています。
  • 9行目:ログオン後のINDEXページを定義します。

 

ログオン用フォームの作成

accountsアプリケーション配下にforms.pyを新規作成し、以下の通り設定します。

 

  • 1~3行目:Django標準のAuthenticationFormクラスを利用すると簡単にログオン用フォームを生成することができるため、django.contrib.auth.formsからAuthenticationFormをインポートしています。
  • 5行目:AuthenticationFormクラスを承継してログオン用のフォームクラス(LoginForm)を定義しています。
  • 9~11行目:ここでは以下の設定を行っています。

      ①全てのフォームの部品のclass属性に「form-control」を指定(bootstrapのフォームデザインを利用するため)

      ②全てのフォームの部品にpaceholderを定義して、入力フォームにフォーム名が表示されるように指定。

      ※上記のすべてのフォームとは、AuthenticationFormクラス内で定義されているfields(フォームのカラム:ユーザ名、パスワード)のことです。

      ※Djangoではウィジェット(widget)と呼ばれる HTML の入力エレメントを表現するためのオブジェク トが存在していて、field.widget.attrs[属性] = <設定値>という形でフォームのデザインを定義することができます。

 

accountsアプリケーションのviews.py設定

accountsアプリケーションのviews.pyに以下のコードを追記します。

 

  • 9行目:LoginViewクラスを承継して、ログオン用クラス(Login)を定義しています。
  • 11行目:form_classでログオンページに利用するフォームクラス(LoginForm)を指定しています。
  • 12行目:ログオンページ用のテンプレートファイルを指定しています。
  • 15行目:LoginRequireMixin、LogoutViewクラスを承継してログアウト用のクラス(Logout)を定義しています。
    LoginRequireMixinクラスを承継しているのは、ログオンしているユーザでないとログアウトボタンを押せないようにするためです。(LoginRequiremixinはログオンしているユーザだけが制御できるようにするためのクラス)
    template_nameでログアウト後に表示されるテンプレートファイルを指定します。
  • 20行目:ログオン後に遷移するテスト用のTOPページを定義した関数です。

今回は、特にモデルの定義はしないので、一旦このままマイグレーションを実行しておきます。

 

テンプレートの作成

まずは、テンプレートの場所をプロジェクト直下のtemplatesに変更するためにsettings.pyに以下の設定をします。

'DIRS': [os.path.join(BASE_DIR, 'templates')],

プロジェクトフォルダ直下に「\templates\accounts」を作成します。

続いて、base.html(共通テンプレート)、index.html(ログオン後のTOP画面),login.html(ログオン画面)を以下の通り作成します。

※テンプレート内の細かいデザインの設定部分は設定例ですので、必ずしも同じでなくてよいです。

■base.html

{% if user.is_authenticated %}  〜〜〜  {% endif %} で囲んだ箇所(ログアウトボタンの表示)は、ログイン中のユーザーにのみ表示されます。
認証済みユーザの場合、Userオブジェクトのis_authenticatedにTrueが設定されます。

■index.html

 

■login.html

  • 9~12行目:テンプレートタグのfor文でformオブジェクトから要素を1つずつfield変数に格納し、{{field}}でフォームを表示しています。
  • 14~18行目: 認証時のエラーは form.non_field_errorsから取得できます。
    エラー内容は{{ error }}と記載することで表示できます。

  • 以下のようにfor文の中にdivのclassでalert-dangerを指定することでエラーが発生した場合に赤枠でエラー内容が表示されるように設定しています。

 

以上で、http://127.0.0.1:8000/accounts/login/にアクセス後にログオンすると、以下のようにログオン画面が表示されます。

ログオンすると、以下のようなTOP画面にログオンします。

さて、ここまでは通常のユーザ認証機能の実装でした。

いよいよ、本題のユーザセッション管理機能を実装していきます。

ユーザセッション管理機能の実装

まず、必要なモジュールをpipでインストールします。

 

settings.pyのINSTALLED_APPS に 'user_sessions' を追加します。

 

settings.pyのMIDDLEWAREに「'user_sessions.middleware.SessionMiddleware',」を追加します。

 

また、settings.pyの末尾に「SESSION_ENGINE = 'user_sessions.backends.db'」を追加します。

次に、プロジェクト直下のurls.pyに以下の設定を追加します。

 

この時点で、再度「python manage.py migrate」を実行します。

以上で設定は完了です。

http://127.0.0.1:8000/account/sessions/にアクセスすると、以下のようなセッション管理画面が表示されます。

デフォルトだと上記画面の通り、ユーザ名が表示されていないのと、英語表記なのでカスタマイズしてみます。

上記画面のテンプレートをカスタマイズするには「Lib\site-packages\user_sessions\templates\user_sessions\session_list.html」を以下の通り修正します。

 

{{ object.ip}}  → ロケーションは不要なのでIPだけ表示するように変更
{{ object.user }} → ユーザ名が表示されるように追加

再度、「http://127.0.0.1:8000/account/sessions/」にアクセスすると以下のような画面に変わります。

画面右側の「End Session」をクリックすると自分のセッションを切断することができます。
※上記管理画には自分のセッションしか表示されないようです。

上記画面は、自分自身のセッションしか切断できませんが、Adminサイト上からは全ユーザのセッションを切断することができます。

adminサイトにログオンすると「セッション」が追加されているのでクリックします。

ログオンしている全ユーザのセッション情報が表示されるので、切断したいユーザにチェックを入れてセッション切断を実行すれば、セッションをKILLすることができます。

以上、「Djangoユーザセッション管理画面の実装」でした。

参考になれば幸いです。

おすすめの記事