Python
Django

Django サイト管理に関するメモ

この記事について

Djangoでは認証機能が追加パッケージ無しで利用できます。
プロジェクトには「サイト管理」というWEBアプリケーションが最初から付属しており、そこでユーザー登録をし、登録したユーザーだけが認証を受けられるという仕組みです。

「サイト管理」には汎用データメンテナンス機能もあります。モデルを定義するだけで適切な登録フォーム画面が生成されるので、これだけでアプリとして運用することも可能です。
基本的な情報とカスタマイズ方法について調べた情報をメモとしてまとめました。

概要

サイト管理とは

Django公式
参考:CodeLab Djangoで管理サイトを作成する

Djangoに付属するユーザ管理用+αのアプリケーション。
デフォルトではアプリ起動後に「サイトのURL/admin/」でアクセスできる。
アクセスするためには、ユーザーにスタッフ権限かスーパーユーザー権限が必要である。

サイト管理でできること

  • ユーザー管理

    • 個人情報の変更
    • パスワードの変更
    • 権限管理
  • データ管理

    • アプリケーションで定義したモデルの追加・変更・削除
  • 操作履歴

    • 上記操作でデータ変更した場合、操作履歴を残す

権限管理

サイト管理の各機能に対してパーミッション(アクセス制限)を設定できる。
パーミッションは最初から登録済みのものと、新しいモデルがマイグレーションで追加するたびに自動作成されるものがある。

パーミッションをユーザーに付与する方法は2つ。

  • ユーザーに直接付与する
  • グループにパーミッションを与え、ユーザーをグループに所属させる

定義

サイト管理で扱われる基本モデル

ユーザー

認証に使用するアカウント情報。

・ユーザーのメイン属性

フィールド名 内容
id ユニークキー(シーケンス)
username ログインID ※1
password パスワード(ハッシュ値)
is_active 論理削除フラグ
is_staff スタッフ権限 ※2
is_superuser スーパーユーザー権限 ※2
first_name 名字
last_name 名前
email メールアドレス
last_login 最終ログイン時間
data_joined 登録日
  • ログインIDは作成後に重複しない範囲で変更可能
  • サイト管理にアクセスするには スタッフ権限(is_staff)かスーパーユーザー権限is_superuserが必要
  • スタッフがサイト管理の各機能を使うためにパーミッションが必要。スーパーユーザーは暗黙的に全パーミッションを持つとみなされる。
  • 自分のパスワードの変更についてはパーミッション無しでも可能。

パーミッション

ユーザーに対してN対Nのリレーションを持つ。
一つのパーミッションはサイト管理内での3つのモデル操作「追加、変更、削除」にそれぞれ対応しており、ユーザーから見てリレーションを持つ操作が許可される。

パーミッションは、新規モデルのマイグレーション時に自動作成される。

デフォルトでパーミッションの効果が及ぶのはサイト管理内だけだが、「django-guardian」というプラグインを使うことで通常のアプリケーションにもパーミッションをかけることができる。

このほか手動でパーミッションを追加することができる。このパーミッションは、アプリケーションのロジックで明示的を読み込んで使う。

グループ

パーミッションとははN対Nの関係があり。パーミッションのコンテナーとして機能する
ユーザーにグループを付与させると、グループに属するパーミッションが全て適用される。
グループの付与はユーザーの管理画面より行う。

構造

管理サイトを構成するパッケージの本体は以下の2つ

  • 'django.contrib.auth' : 認証に必要な中核処理
  • 'django.contrib.admin' : ウェブアプリケーション部分

基本モデルはauthにある。

  • django.contrib.auth.models.User
  • django.contrib.auth.models.Permission
  • django.contrib.auth.models.Group

カスタマイズ方法

ユーザーのカスタマイズ

[参考] https://torina.top/detail/350/

ユーザーの項目やメソッドをカスタマイズで追加・修正することができる。
まず、以下のクラスを継承した自作Userクラスをアプリケーションに定義する。

django.contrib.auth.models.AbstractUser ※追加のみを行う場合
django.contrib.auth.models.AbstractBaseUser ※基本属性の修正をする場合

そして、settiing.pyに以下のように定義する
AUTH_USER_MODEL = 'app.User' ※自分で定義したUserモデル

サイト管理でカスタムユーザークラスを使うには、admin.pyの修正も必要である。

サイト管理画面のカスタマイズ

サイト管理の一覧画面、編集画面はカスタマイズ可能。
項目を表示するか、編集させるかを変更できる。

Django 管理画面逆引きメモ

私見

サイトは便利ですが以下の欠点があります。

  • デザインの変更が難しい。
  • 以下のような中間的なパーミッションの設定が困難。
    • 自分や所属部署のデータのみ変更できる、行レベルのパーミッション
    • 付与されたパーミッションを他人に付与する

カスタマイズできなくはないですが、アプリケーションで同様の制御をするより複雑になってしまいます。
ですので、サイト管理の利用は全データにアクセスして問題ない特権的なユーザーに限定し、それ以外のユーザーで必要となる機能はアプリケーションで実装するという方針にします。

authのモデルやadminのフォームは部品化しており、自作のアプリケーション内で利用することもできます。