結論
djangorestframework
を使用して、セッション認証を通すように実装します。そうすることで、事前にブラウザ上でログインをしていないと使用できないRESTAPIを作成できます。
前提
- djangoでWebアプリを既に作成している。何かしらの方法でログイン・ユーザー認証を実装できている状態であるとします。
- 使用モジュールの各バージョンは以下です
- Django 3.2.20
作成手順
- pipで下記のモジュールをインストールします。
pip install djangorestframework pip install markdown pip install django-filter
-
settings.py
に下記のコードを追加します。settings.py# ... INSTALLED_APPS = [ # ... 'rest_framework', # 追加 # ... ] # ... # 追加 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', ] }
- 下記に則ったコードでRESTAPIの処理となるViewを作成します。
views.py
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated class AuthTestView(APIView): permission_classes = [IsAuthenticated] def get(self, request, format=None): return Response({"message": "OK"})
- urlsに作成したViewをルーティングします。
これで、ルーティングしたURLにアクセスすると、ログイン・ユーザー認証できていないと使用できないことが確認できます。
補足
-
settings.py
で、DEFAULT_AUTHENTICATION_CLASSES
を設定しました。これはプロジェクトを通してRESTAPIはセッション認証を通すという設定です。もし各Viewで設定したい場合は下記のようにauthentication_classes
をView上で設定すればOKです。
views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.authentication import SessionAuthentication # 追加
from rest_framework.permissions import IsAuthenticated
class AuthTestView(APIView):
authentication_classes = [SessionAuthentication] # 追加
permission_classes = [IsAuthenticated]
def get(self, request, format=None):
return Response({"message": "OK"})
- Viewを作成するときに、今回は
APIView
を継承しています。これは他にも継承できるものがあり、それぞれの機能によって役立つものがあるようです。詳しくは下記の記事が参考になります。
- POSTメソッドを作成する場合、設定によってはクライアント側がcsrftokenを持たせて通信しないと認証失敗となります。この場合はクライアント側にcsrftokenを持たせて通信をするようにしてください。
以上です。
参考