djangoのデコレータ(Decorator)関数は便利ですね。
viewsで定義した関数の一行上で「@」のように表示されるアレです。
本日は実例を基に、実際のコードを書いてdjangoのデコレータ(Decorator)を紹介していきます。
コンテンツ
環境
・python 3.8
・django 2.2
作成しようと思った理由
そもそもどのような時に、djangoのデコレータ関数をしょうしたくなるかというと、「毎回同じように書いている関数を一つにまとめて必要な時だけ取り出して使用したい。」というところからです。
つまりオブジェクト思考です。
今回の例では、djangoでログインフォームを作成した後に、非ログイン状態のユーザーにはログインフォームに飛ばすのではなく403でアクセスさせない画面を作成したいと想定しました。
毎回非ログイン状態のユーザーを403に表示させるコードを書くのは大変ですよね。
例にあげてみます。
views.py
1 2 3 4 5 6 7 8 |
from django.core.exceptions import PermissionDenied def profile(request): """プロフィールページ """ if not request.user.is_authenticated: raise PermissionDenied return (render, 'profile.html') |
プロフィールページになりますが、プロフィールページはログイン中のユーザー以外の非ログインユーザーがアクセスしようとしたら403エラーを排出させて閲覧禁止にしたいですよね。
※ちなみに403エラーとは下記参照
【403エラー】そのページは存在するけど、特定のアクセス者にページを表示する権限が付与されず、アクセスが拒否されたことを示すもの。
https://ja.wikipedia.org/wiki/HTTP_403
このプロフィール以外にもログイン後のページには多くの閲覧禁止エリアを作成したので、毎回各ページ毎に以下のコードを設置するのはめちゃくちゃ面倒くさいわけですし、これこそオブジェクト思考に反するコードになるわけです。
1 2 |
if not request.user.is_authenticated: raise PermissionDenied |
デコレータとは
デコレータは早い話がpythonの関数です。
条件さえ整っていればいつでもどこでも呼び出して検証できる関数を指し、django内で自作ができます。
デコレータの自作手順
それでは早速作成していきます。
とりあえず同じファイルページに作成することにします。
作成したのが以下になります。
views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
from django.core.exceptions import PermissionDenied def permission(func): """非ログイン状態でアクセスしたら404を排出 """ def checker(request, *args, **kwargs): func(request) if request.user.is_authenticated: return func(request, *args, **kwargs) else: raise PermissionDenied return checker @permission def profile(request): """プロフィール """ return render(request, 'profile.html') |
使い方を説明します。
- 何者かがprofile.htmlにアクセスしたとき、まず15行目の@permissionで3行目のpermission関数が呼び出されます。
- 6行目でcheckerという関数名を命名し、引数としてrequest, *args, **kwargsを書いておきます。*args,**kwargsの説明に関してはこちらから。よくわからないよ!!って人はおまじないとして書いておきましょう。
- 8行目は、もしユーザーがログイン状態の場合は9行目のreturnでfuncを返しています。
- 10行目は、もしユーザーが非ログイン状態の場合は、11行目で強制的に403画面を排出します。このPermissionDeniedは1行目から呼び出しています。
参考
https://docs.djangoproject.com/ja/2.2/topics/auth/default/#limiting-access-to-logged-in-users
最後に
いかがでしたでしょうか。
以上が、「【Django】デコレータ(Decorator)の自作と使い方 」の紹介記事になります。
開発を進めていると何度も使用していくことになりますので、是非オリジナルのデコレータを作成して実装してみてはいかがでしょうか?
プログラミング学習を効率良く進めるには…
私ヒロヤンがプログラミングを始めた頃は以下のような感じでした。
そしてネットで調べていくうちに膨大な時間が過ぎていきました。
私ヒロヤンの実体験より、プログラミングを効率的に学ぶために大切なことは以下のことだと考えています。
1. いつまでもダラダラとやらないで、目標を決定して短期集中する
2. マンツーマンで、わからない箇所は直ぐに質問をして即レスをもらう
.proでは私ヒロヤンが学習してきたプログラミング経験0からのpython/django、その他webサイト・サービス開発のコースが用意されています。
カウンセリング自体は無料なので話を聞いてみるだけでもいかがでしょうか?
また以下のリンク先ではdjangoを教えてくれるスクールをまとめ紹介しています。
コメントを残す