[解決済み] Djangoのグループとパーミッションはどのように使用するのですか?
質問
基本的なユーザーに関することは理解しています。 私は認証、ログイン、アカウントの作成などを知っています。しかし、今私はグループとパーミッションに取り組みたいと思っています。
django のグループ/パーミッションのためのドキュメントはどこにありますか?これはそれではないです。 http://docs.djangoproject.com/en/dev/topics/auth/
どのように解決するのですか?
最初の質問は、どのような権限が必要で、どのような種類なのか、ということだと思います。 どのような種類かというのは、モデル レベルかオブジェクト レベルかということです。 違いを明確にするために、モデル Car があるとします。 もし、すべての車に対してパーミッションを与えたいのであれば、モデルレベルが適切ですが、車ごとにパーミッションを与えたいのであれば、オブジェクトレベルが必要です。 両方が必要な場合もありますが、後ほど説明するように、これは問題ではありません。
モデルパーミッションについては、Django があなたのために処理してくれます...ほとんど。 各モデルに対して、Django は 'appname.permissionname_modelname' という形式でパーミッションを作成します。 もし 'drivers' というアプリと Car モデルがあれば、一つのパーミッションは 'drivers.delete_car' となります。 Django が自動的に作成するパーミッションは、 create, change, delete になります。 奇妙な理由で、CRUD からの読み取りパーミッションは含めないことにしたようで、 これは自分でやらなければなりません。 Django は、なぜか CRUD の 'update' を 'change' に変更することにしたことに注意し てください。 モデルにさらに権限を追加するには、例えば読み取り権限を追加するには、 Meta クラスを使います。
class Car( models.Model ):
# model stuff here
class Meta:
permissions = (
( "read_car", "Can read Car" ),
)
permissionsはタプルのセットであり、タプル項目は上記のようなパーミッションとそのパーミッションの説明であることに注意してください。 permname_modelname の規則に従う必要はありませんが、私は通常それに従います。
最後に、パーミッションをチェックするために、has_permを使用することができます。
obj.has_perm( 'drivers.read_car' )
ここで、objはUserまたはGroupのインスタンスです。 これについては、関数を書く方がシンプルだと思います。
def has_model_permissions( entity, model, perms, app ):
for p in perms:
if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
return False
return True
entityはパーミッションをチェックするオブジェクト(GroupまたはUser)、modelはモデルのインスタンス、permsはチェックするパーミッションの文字列リスト(例えば ['read', 'change'] )、appはアプリケーション名(文字列)です。 上記のhas_permと同じチェックを行うには、以下のような呼び出しを行うことになります。
result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )
オブジェクトや行のパーミッション (これらは同じ意味です) を使う必要がある場合、 Django はそれ自体ではあまり役に立ちません。 良い点は、モデルパーミッションとオブジェクトパーミッションの両方を並行して使うことができることです。 オブジェクトパーミッションが必要な場合は、以下のどちらかを行わなければなりません。 を自分で書くか (1.2+を使用している場合) または他の人が書いたプロジェクトを見つけてください。 django-objectpermissions で、washingtontimes からです。
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Pythonの文字列の前にあるbという接頭辞は何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] Python Empty Generator 関数
-
[解決済み] Pythonの辞書にあるスレッドセーフについて
-
[解決済み] Django filter queryset __in for *every* item in list