Django REST Frameworkでユーザ認証を行う方法を簡単に解説
スポンサードリンク
おはようございます。Shotaです。
今回はDjango REST Frameworkを使って簡単にユーザ認証を行う方法を徹底解説します。
基本設定
# 最初にプロジェクトを作成する mkdir django-app cd django-app # DjangoとDjango REST Frameworkをインストールする pip install django pip install djangorestframework # Djangoのプロジェクトを作成する django-admin startproject Backend . django-admin startapp _app
プロジェクトは以下のようになります。
ディレクトリ: C:\Users\autho\Documents\nuxt_django_loginapp Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2021/12/28 9:14 Backend d----- 2021/12/28 9:50 _app -a---- 2021/12/28 9:10 143360 db.sqlite3 -a---- 2021/12/28 9:10 685 manage.py ディレクトリ: C:\Users\autho\Documents\nuxt_django_loginapp\Backend Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2021/12/28 9:10 407 asgi.py -a---- 2021/12/28 9:10 3560 settings.py -a---- 2021/12/28 9:10 170 urls.py -a---- 2021/12/28 9:10 407 wsgi.py -a---- 2021/12/28 9:10 0 __init__.py ディレクトリ: C:\Users\autho\Documents\nuxt_django_loginapp\_app Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2021/12/28 9:14 migrations -a---- 2021/12/28 9:10 66 admin.py -a---- 2021/12/28 9:10 145 apps.py -a---- 2021/12/28 9:10 60 models.py -a---- 2021/12/28 9:10 395 serializers.py -a---- 2021/12/28 9:10 63 tests.py -a---- 2021/12/28 9:52 418 urls.py -a---- 2021/12/28 9:10 724 views.py -a---- 2021/12/28 9:10 0 __init__.py ディレクトリ: C:\Users\autho\Documents\nuxt_django_loginapp\_app\migrations Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2021/12/28 9:10 0 __init__.py
後は以下のコマンドを入力して、データベースを作成してください。
python manage.py migrate
そして、管理者(superuser
)を作成するためのコマンドを入力してください。
python manage.py createsuperuser --email admin@example.com --username admin
Serializerの作成
まずは、django-app/_app/serializers.py
を作成して、以下のプログラムを書いてください。
# django-app/_app/serializers.py from django.contrib.auth.models import User, Group from rest_framework import serializers # Djangoにデフォルトで備わっているUserモデルを使う。 class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ['url', 'username', 'email', 'groups'] # Userモデルと同様に、デフォルトで備わっているGroupモデルを使う。 class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ['url', 'name']
この場合、HyperlinkedModelSerializerでハイパーリンクされたリレーションを使用していることに注意してください。主キーや他の様々なリレーションを使用することもできますが、本記事ではハイパーリンクを使用します。
Viewsの作成
# django-app/_app/serializers.py from django.contrib.auth.models import User, Group from rest_framework import viewsets from rest_framework import permissions from .serializers import UserSerializer, GroupSerializer class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all().order_by('-date_joined') serializer_class = UserSerializer permission_classes = [permissions.IsAuthenticated] class GroupViewSet(viewsets.ModelViewSet): queryset = Group.objects.all() serializer_class = GroupSerializer permission_classes = [permissions.IsAuthenticated]
複数のビューを書くのではなく、共通の動作をまとめてViewSet
と呼ばれるクラスにしています。
必要であれば、これらを個々のビューに分解することもできますが、ViewSet
を使用することで、プログラムをうまく整理し、非常に簡潔なものにすることができます。
URLsの作成
次に、APIのURLを簡潔に作成します。Backend/urls.py
に以下のプログラムを書いてください。
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('_app.urls')), ]
その後、_app/urls.py
を新規作成して、以下のプログラムを書いてください。
from django.urls import include, path from rest_framework import routers from tutorial.quickstart import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet) router.register(r'groups', views.GroupViewSet) urlpatterns = [ path('', include(router.urls)), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
View
の代わりにViewSet
を使っているので、ViewSet
をrouter
に登録するだけでAPI用のURL
を自動で作成できます。
API の URL をもっと制御したい場合は、通常のクラスベースのviewを使用するようにし、URL
を明示的に記述することができます。
Settingsの作成
Backend/settings.py
にアクセスして、定数INSTALLED_APPS
に'rest_framework'
と'_app'
を追加してください。
INSTALLED_APPS = [ ... 'rest_framework', '_app' ]
APIのテスト
まずは、以下のコマンドで開発者用サーバを立ち上げてください。
python manage.py runserver
そして、curl
コマンドで以下のコマンドを入力してください。
curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/
▼出力結果
{ "count": 2, "next": null, "previous": null, "results": [ { "email": "admin@example.com", "groups": [], "url": "http://127.0.0.1:8000/users/1/", "username": "admin" }, { "email": "tom@example.com", "groups": [], "url": "http://127.0.0.1:8000/users/2/", "username": "tom" } ] }
これで簡単なユーザ認証を実装できましたね。
まとめ
今回の記事では、Django REST Frameworkで非常に簡単なユーザ認証を実装する方法を簡単に解説しました。
今回の記事はこれで終了です。
【参考サイト】
【ソースコード】