Django REST frameworkを使ってAPIを作成してみる
🍀 Django REST framework
Django REST frameworkはPythonで動作するREST APIの作成ツールです
大元のWebアプリケーションフレームワークのDjangoを拡張したものになっています
// TODO : REST APIについての説明
🖥 開発環境
- Macbook Pro (intel)
- OSX 13.1
- VS Code
📚 インストール
Pythonの仮想環境を作ってそこに、Djangoのアプリケーションを作成していきます
$ python -m venv env
$ source env/bin/activate
pipでDjangoとREST frameworkをインストール
$ pip install django
$ pip install djangorestframework
Djangoでプロジェクトとアプリケーションをセットアップします
[プロジェクト名]
と[アプリケーション名]
には任意の文字列を入れてください
$ django-admin startproject [プロジェクト名]
$ cd [プロジェクト名]
$ django-admin startapp [アプリケーション名]
そうしたら以下のようにファイルが生成されているはずです
./
├── db.sqlite3
├── manage.py
├── myproject
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-310.pyc
│ │ ├── settings.cpython-310.pyc
│ │ └── urls.cpython-310.pyc
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── myapp
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
このうちのsettings.py
を開いて、INSTALLED_APPS
に'rest_framework'
を追加します
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'rest_framework',
]
これでDjango REST Framework のセットアップは完了です
Serializerの設定
Serializerとは、APIを通して入出力するデータを適切な形に整形するシステムのことです
送られるデータに関してはPythonのデータ型で、送るデータに関してはJSONやXMLなどのユーザーが扱いやすい形に変換します
Model(モデル)とよばれる、データの形に基づいてデータを適正に処理します
アプリケーションのディレクトリ内で適当にserializer.py
モジュールを作成します
from django.contrib.auth.models import User, Group
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']
とりあえず、標準で用意されているUser
とGroup
モデルを利用してSerializerを作成しました
serializers.HyperlinkedModelSerializer
ではURLに紐づけられたSerializerを提供します
Meta
では定義したSerializerの情報を表記します
どのモデルを利用するのか、と必要なフィールド情報はどれなのか、などを定義します
この場合はfields
に自身のURLを表すフィールドが必要です
表示の設定
利用者のブラウザ上での表示方法の設定を行います
REST Frameworkではviewset
という、標準の便利な表示方法があり、せっかくなのでこれを利用します
アプリケーションディレクトリのviews.py
を以下のように書き換えます
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from rest_framework import permissions
from myproject.myapp.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
ユーザ情報の表示・編集を行うAPIのエンドポイント
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
"""
グループ情報の表示・編集を行うAPIのエンドポイント
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = GroupSerializer
クラス下の文字列は表示の際にドキュメントとして扱われます
markdownモジュールを導入していればマークダウン形式で表記を行うことが可能です
ルーティング
プロジェクトディレクトリ内のurls.py
でそれぞれのAPIへのURLを通します
rest_framework
のrouters
で各APIへルーティングを行います
from django.urls import include, path
from rest_framework import routers
from myapp import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
urlpatterns = [
path('', include(router.urls)),
]
rest_framework
の標準ルータはrest_framework.routers.DefaultRouter()
もしくはrest_framework.routers.SimpleRouter()
で実装することができます
SimpleRouter
は基本的なCRUD機能のみを提供します
DefaultRouter
ではSimpleRouter
の機能に加えて、自動生成されるAPIのリストビューを提供します
ルータで定義したURLはrouter.urls
で取得できるので、それをDjangoのpathで通します
サーバーを稼働してテストする
これで完成です
さっそく動かしてテストしてみます
先にデータベースを構築してから稼働させます
$ python manage.py migrate
$ python manage.py runserver
http://127.0.0.1:8000/users/ にアクセスすると、先ほど作ったAPIのリストビューが出力されます
Discussion