DjangoでAPIを実装する方法(Django REST framework)

DjangoでAPIを実装する方法(Django REST framework)をご紹介します。

今回は、公式サイトのQuickStartをPyCharmで実装します。

条件

  • Django 2.1.7
  • Python 3.7.0
  • djangorestframework 3.9.2
  • PyCharm Professional 2018.3

プロジェクト作成

PyCharmでDjangoプロジェクトを作成します。

  • ロケーション:tutorial
  • アプリケーション名:quickstart

パッケージインストール

必要なパッケージをインストールします。

ファイル > 設定 > プロジェクト・インタープリター
「djangorestframework」を追加します。

または、ターミナルで以下のコマンドを実行してインストールします。

pip install djangorestframework

マイグレート

PyCharmで、Ctrl + Alt + R を押してmanage.pyコンソールを開きます。
migrateを実行します。

スーパーユーザー作成

スーパーユーザーの作成を行います。
manage.pyコンソールで以下のコマンドを実行します。

createsuperuser --email admin@example.com --username admin

パスワードは以下の通りとします。
password123

パスワードが一般的すぎるという警告が出ますが、OKとします。(yを押します)

Serializers

シリアライザーの作成を行います。

以下のファイルを作成します。
tutorial/quickstart/serializers.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')

views.py

views.pyを以下のように記述します。

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from quickstart.serializers import UserSerializer, GroupSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    serializer_class = UserSerializer


class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

urls.py

tutorial/urls.pyを以下のように記述します。

from django.urls import path, include
from rest_framework import routers
from quickstart import views

router = routers.DefaultRouter()
router.register('users', views.UserViewSet)
router.register('groups', views.GroupViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

router.register()で指定した値がAPIのURLになります。
例)users ⇒ http://127.0.0.1:8000/users/

ページネーション

settings.py

tutorial/settings.pyに以下を記述します。

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10
}

INSTALLED_APPSの設定

settings.py

tutorial/settings.pyに「rest_framework」を追記します。

INSTALLED_APPS = (
    ...
    'rest_framework',
)

実行結果

manage.pyコンソールでrunserverを実行してサーバーを起動ます。

curlによる実行

コマンドラインで以下のコマンドを実行します。(Git Bashを使用しています。)
「-u」でアカウント名とパスワードを渡します。

curl -H 'Accept: application/json; indent=4' -u admin:password123 http://127.0.0.1:8000/users/

ユーザー情報が取得できます。

ブラウザでの実行

コマンドラインで以下のURLを指定します。

http://127.0.0.1:8000/users/

右上のログインリンクを選択します。

ログインすると、右上にユーザ名が表示されるようになります。

レコードの追加/更新/削除

下のフォームに必要な内容を記述後、POSTボタンを押すとレコードを追加することができます。

対象レコードを表示した状態(例:http://127.0.0.1:8000/users/2/ のようにIDを指定)で、更新/削除を行うことができます。

  • PUTで更新
  • DELETEで削除

様々な操作後、レコードが追加/更新されていることがわかります。

サンプルソース

GitHubに当該記事のサンプルソースを公開しています。

https://github.com/kzmrt/tutorial

参考

Django REST framework

https://www.django-rest-framework.org/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です