Django adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法

今回はDjango adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法についてご紹介いたします。



Django adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法

Django adminのカスタマイズを行っているときのことです。

@admin.registerのデコレーターを使ってget_urlsからAPIのエンドポイントを作成したものの、普通にソースコードを書いただけではログインしてる、してないに関わらずAPIを発行できてしまうことに気付きました。

サンプルプログラムは下記の通りです。

上記の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です。

self.admin_site.admin_viewで囲ってやるだけで、ログインしていない状態で上記エンドポイントを叩いたときは、自動的にログイン画面にリダイレクトされます。

詳しくはadmin_site.admin_viewでググれば内部でどのような処理をしているのか分かるはずです。

当然、selfを使っているので、使用するクラスによってはエラーが発生します。
少なくとも管理画面のadmin.pyでモデルを登録している場合は上記のself.admin_site.admin_viewが使えるはずです。

ぜひ参考にしてみてください。

終わりに

今回はDjango adminのカスタマイズでログインした状態のみAPIのエンドポイントを公開する方法についてご紹介いたしました。

【お知らせ】
プログラミングのコンサルタントをすることを考えております。
下記の通り、かなり格安でご用意させていただいております。
【格安】プログラミングコンサル生募集(初心者向け、フリーランス志望向け)

詳しくは下記のリンクをご覧ください。
https://chico-shikaku.com/2020/10/programming-consult-2020/

11月くらいを目処に開始予定です。
最初は募集があれば先着5名くらいを目安に考えております。
質問や意見、問い合わせやお申し込みは下記のリンクよりお願いいたします。
https://docs.google.com/forms/d/e/1FAIpQLSeTXskmlyPAHuhwiOE9togqJPWdhXYCyRoVnFkkbS0VN0Ftug/viewform?usp=sf_link

最後までお読みいただきありがとうございます。
ブログやTwitterでのシェアOKです。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。






Django

Posted by ちこ