Django REST framework を実装する

シェアする

Django REST framework を実装します。と言っても、あまり詳しくないでの、まずはチュートリアルのクイックスタート実装をして、どんなものかを見ていきたいと思います。

Django REST framework は DRF と略して表記されることも多いので、本記事でも DRF と表記していきます。

完成イメージ

環境バージョン

  • Python 3.6.4
  • Django 2.0.3
  • Django REST framework 3.8.2

インストール

Python, Django

Python と Django のインストールは、Python Web フレームワーク Django の環境を構築するの記事を参考にしてください。

Django REST framework

$ sudo pip install djangorestframework

DRF をインストールします。

startproject, startapp

$ django-admin startproject tutorial
$ cd tutorial
$ python3.6 manage.py startapp quickstart

通常の Django 同様にプロジェクトとアプリケーションを作成します。

実装

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')

serializers.py です。シリアライザとは、オブジェクトと json などのデータのマッピングやバリデーションを行います。

クイックスタートチュートリアルのシリアライザは HyperlinkedModelSerializer です。HyperlinkedModelserializer は、リレーションをハイパーリンクで表すことを除いて、Modelserializer と似ています。何を言ってるのかさっぱりですね。

以下の例を見ればわかると思います。groups がハイパーリンクかプライマリキーかの違いです。

HyperlinkedModelSerializer

{
    "url": "http://192.168.33.10:8000/users/1/",
    "username": "user1",
    "email": "user1@example.com",
    "groups": [
        "http://192.168.33.10:8000/groups/1/"
    ]
}

ModelSerializer

{
    "url": "http://192.168.33.10:8000/users/1/",
    "username": "user1",
    "email": "user1@example.com",
    "groups": [
        1
    ]
}

Views

tutorial/quickstart/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

views.py です。ModelViewSet を継承しています。この ViewSet は、対応する model の CRUD 処理が実装されていますので、上記のコード量だけで、CRUD API が完成します。

URLs

tutorial/tutorial/urls.py

from django.conf.urls import url, include
from rest_framework import routers
from quickstart import views

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

# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
    url(r'^', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

urls.py です。views.py で実装した viewset を ルーティングします。

Settings

tutorial/tutorial/settings.py

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = [
    ...
    'quickstart.apps.QuickstartAppConfig',
    'rest_framework',
]

settings.py はいつも通りです。どこからでもアクセスを許可するために、ALLOWED_HOST に ‘*’ をセットし、INSTALLED_APPS に、アプリケーションを追加します。

tree

$ tree
.
├── manage.py
├── quickstart
│   ├── __init__.py
│   ├── apps.py
│   ├── serializers.py
│   └── views.py
└── tutorial
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

2 directories, 9 files

ファイル構成はこのようになりました。

DB マイグレーション

$ python3.6 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
$

DB はデフォルトの sqlite を使います。startproject で吐き出される settings.py のままで、migrate コマンドを叩きます。

動作確認

runserver

$ python3.6 manage.py runserver 0.0.0.0:8000

Django デバッグサーバの runserver を起動し、ブラウザでアクセスして見ましょう。Django REST framework のページが確認できたと思います。

まとめ

Django REST framework を実装しました。

DRF を導入することで、Django に簡単に RESTful な API を実装することができました。DRF は Django 関連パッケージの中でも最も人気のあるパッケージで、オフィシャルのドキュメントをみると、機能の多さにびっくりします。今後も DRF の様々な機能を試していきたいと思います。