Django adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法
今回はDjango adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法についてご紹介いたします。
Django adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法
Django adminのカスタマイズを行っているときのことです。
@admin.registerのデコレーターを使ってget_urlsからAPIのエンドポイントを作成したものの、普通にソースコードを書いただけではログインしてる、してないに関わらずAPIを発行できてしまうことに気付きました。
サンプルプログラムは下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 |
@admin.register(User) class AdminUserAdmin(UserAdmin): list_display = ('username', 'email', 'testlist') change_list_template = 'admin/account/User/change_list.html' def get_urls(self): urls = super().get_urls() extra_urls = [ path('test/api', SampleUserView.as_view()), ] return extra_urls + urls |
上記のextra_urlsに書かれているtest/apiが今回私が作成したAPIですね。
普通に上記を書いただけだと、例えば
http://localhost/admin/test/user/test/api
のエンドポイントを叩いたときにDjango adminにログインしている、していないに関わらずresponseが返ってきてしまいます。
Django adminはセッションでログイン状態を保持しているらしく、最初はセッション認証周りをかなり調べていました。
実は、簡単にDjango adminにログインしたときのみカスタマイズしたAPIのエンドポイントを叩くことができるようになるのです。
上記のソースコードの例では、下記のようにpathの二番目の引数に対してself.admin_site.admin_viewで囲ってやればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 |
@admin.register(User) class AdminUserAdmin(UserAdmin): list_display = ('username', 'email', 'testlist') change_list_template = 'admin/account/User/change_list.html' def get_urls(self): urls = super().get_urls() extra_urls = [ path('test/api', self.admin_site.admin_view(SampleUserView.as_view())), ] return extra_urls + urls |
self.admin_site.admin_viewで囲ってやるだけで、ログインしていない状態で上記エンドポイントを叩いたときは、自動的にログイン画面にリダイレクトされます。
詳しくはadmin_site.admin_viewでググれば内部でどのような処理をしているのか分かるはずです。
当然、selfを使っているので、使用するクラスによってはエラーが発生します。
少なくとも管理画面のadmin.pyでモデルを登録している場合は上記のself.admin_site.admin_viewが使えるはずです。
ぜひ参考にしてみてください。
終わりに
今回はDjango adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法についてご紹介いたしました。
ディスカッション
コメント一覧
まだ、コメントがありません