概要
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 件のコメント:
コメントを投稿