Django REST framework を実装します。と言っても、あまり詳しくないでの、まずはチュートリアルのクイックスタート実装をして、どんなものかを見ていきたいと思います。
Django REST framework は DRF と略して表記されることも多いので、本記事でも DRF と表記していきます。
Contents
完成イメージ
環境バージョン
- 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 の様々な機能を試していきたいと思います。