2024年1月24日水曜日

django-rest-framework を試す

django-rest-framework を試す

概要

django で REST API を構築することができるプラグインがあったので試してみました

環境

  • macOS 11.7.10
  • Python 3.11.6
  • django 5.0.1
  • django-rest-framework 3.14.0

インストール

  • pipenv run djangorestframework

プロジェクト作成

  • pipen run django-admin startproject tutorial .
  • cd tutorial
  • django-admin startapp quickstart
  • cd …
tutorial
├── __init__.py
├── asgi.py
├── quickstart
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   └── views.py
├── settings.py
├── urls.py
└── wsgi.py

マイグレーション

今回はマイグレーションで自動的に作成されるユーザテーブルの情報を使うようです

  • pipenv run python manage.py migrate

ユーザ作成

  • python manage.py createsuperuser --username admin --email admin@example.com

パスワードだけ入力します

シリアライザの作成

データベースのモデルをレスポンスモデルに変換するクラスです

  • vim tutorial/quickstart/serializers.py
from django.contrib.auth.models import Group, User
from rest_framework import serializers


class UserSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = User
        fields = ["url", "username", "email", "groups"]


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ["url", "name"]

ビューの作成

先程のシリアライザを指定します
データベースから取得したデータは指定されたシリアライザを使って自動的にレスポンスデータに変換されます

  • vim tutorial/quickstart/views.py
from django.contrib.auth.models import Group, User
from rest_framework import permissions, viewsets

from tutorial.quickstart.serializers import GroupSerializer, UserSerializer


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]

URL マッピングの追加

admin 用の画面と実際に REST API をコールするためのマッピングを追加します
REST は DefaultRouter を使って定義します

  • vim tutorial/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")),
]

urlpatterns += router.urls

自動ページネイトの追加

SQL から取得したデータが長い場合などに自動でページネイト処理をしてくれるようです

  • vim tutorial/settings.py
REST_FRAMEWORK = {
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.PageNumberPagination",
    "PAGE_SIZE": 10,
}

REST アプリの追加

最後に REST アプリのの設定を追加します

  • vim tutorial/settings.py
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
]

動作確認

  • pipenv run python manage.py runserver

認証あり API なので先程作成したユーザとパスワードを入力しましょう

  • curl -s -u admin -H 'Accept: application/json' http://localhost:8000/users/ | jq .
{
  "count": 1,
  "next": null,
  "previous": null,
  "results": [
    {
      "url": "http://127.0.0.1:8000/users/1/",
      "username": "admin",
      "email": "admin@example.com",
      "groups": []
    }
  ]
}

ブラウザで http://localhost:8000/users/ いアクセスすると管理画面を使えます
右上のログインから admin ユーザでログインすると REST API をコールするクライアントとして使えます

最後に

django-rest-framework を試してみました

触りだけなので何ともですがリクエストモデルやレスポンスモデルはシリアライザを使えばうまく表現できるかもしれません
ビューの queryset などは独特の記法なのでこのあたりは django に慣れている場合は嬉しいかもしれません
URL マッピングなども django の機能をそのまま使っているようです

admin が付属しているのでテストなどはしやすいかもしれません

参考サイト

0 件のコメント:

コメントを投稿