Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

Django REST Frameworkでユーザ認証を行う方法を簡単に解説


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20211129061822p:plain

おはようございます。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を使っているので、ViewSetrouterに登録するだけで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で非常に簡単なユーザ認証を実装する方法を簡単に解説しました。

今回の記事はこれで終了です。

【参考サイト】

www.django-rest-framework.org

ソースコード

github.com