こんにちは。ryoです。
今回は、DjangoからREST Frameworkを使ってAPIを作る方法を解説したいと思います。
REST、APIについて何も知らなくても、この記事解説していくので問題はありません。
この記事では、
・REST、APIとは何か
・REST Frameworkのインストール
について解説します。さらに、
・REST FrameworkをつかったAPIの作り方
についての解説を通して、実際にAPIを作ってみましょう。
RESTとは
REST(レスト)とはWebサービスの設計モデルのことです。
Djangoについてこれまで学んできた方なら、設計モデルという言葉に聞き覚えがあるかもしれません。
設計モデルとはDjangoのMTV(Model・Template・View)のように、システムに共通する性質や作法を表します。
Webサービスにも共通して存在する性質があるということですね。
RESTには具体的な性質(原則)がありますが、少し難しい話になってしまうのでここでは割愛します。
ただGoogle(https://www.google.co.jp/)やYahoo(https://www.yahoo.co.jp/)のWebサービスに代表されるように、
・同じURLからは常に同じ内容のレスポンスが返ってくる。
・クライアントのマシンの状態やブラウザのセッションに依存しない。
これらの項目をはじめとする原則を満たしているサービスを、RESTfulなサービスと呼びます。
APIとは
APIについても知っておきましょう。
TwitterなどのWebサービスを使っているときに、APIという文字を見たことがあるかもしれません。
APIとは、外部とソフトウェアの機能を共有するためのプログラムのことです。
TwitterではTwitter APIを使うことで、自分でもTwitterクライアントを作ることが出来るようになります。
詳しくはこちらの記事をご覧ください。
REST Frameworkのインストール
APIを作るためにはREST Frameworkをインストールしなければいけません。
pipからREST Frameworkをインストールしましょう。
pip install djangorestframework
このコマンドを実行するだけで、REST Frameworkはインストール出来ました。
次の章からは、APIを作っていきます。
APIを作ってみよう
ここからは実際にAPIを作ってみましょう。
ここから動作させるコードやコマンドはすべてMacで実行したものになります。
WindowsやLinuxで動かす場合は、コマンドを置き換えて見てください。
また、Pythonの環境は、
・Python 3.6.0
・Django 1.11.2
となっています。
Djnagoの下準備
まずはDjangoの環境を整えましょう。
Djangoはプロジェクトを作成して、その中にWebアプリケーションを作成するのが基本の流れになっています。
まずは、プロジェクトを作りたいディレクトリに移動して、このコマンドを実行しましょう。
django-admin startproject mySite
これでmySiteというディレクトリが出来上がります。
次にmySiteディレクトリに移動して、このコマンドを実行しましょう。
python manage.py startapp myapp
これでmySiteプロジェクトの中に、myappというWebアプリケーションが出来上がりました。
現在のディレクトリ構成はこのようになっています。
mySite ├── manage.py ├── mySite │ ├── __init__.py │ ├── __pycache__ │ │ ├── __init__.cpython-36.pyc │ │ └── settings.cpython-36.pyc │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── myapp ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py └── views.py 4 directories, 14 files
次に、mySite/settings.pyのINSTALLED_APPSを編集していきます。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myapp', 'rest_framework', ]
INSTALLED_APPSに、myappとrest_frameworkを追加しました。
これでDjangoの下準備は出来ました。
データベースの準備
Djangoはmodels.pyを編集することでデータベースを使うことが出来るようになります。
modelsについての詳しい解説はこちらの記事をご覧ください。
myapp/models.pyを編集していきます。
from django.db import models class User(models.Model): name = models.CharField(max_length=64) class Article(models.Model): user = models.ForeignKey(User, related_name='articles') title = models.CharField(max_length=1024) contents = models.TextField()
ここではUserとArticleを定義して、ブログサービスのようなものを作っていくと仮定します。
ここまで出来たらマイグレーションファイルを作ります。
python manage.py makemigrations myapp
次にこのコマンドを実行します。
python manage.py migrate
これでデータベースの作成は完了です。
Djangoでファイルを編集した場合は、開発サーバが起動中でも自動で更新してくれます。
しかし、データベースの変更は自分で更新をしなければなりません。
この手順はしっかりと覚えておきましょう。
Serializerの定義
REST FrameworkではSerializerと呼ばれるモジュールをよく使います。
Serializerはデータベースの保存などの機能がとても豊富で、まさにREST Frameworkの肝となる部分です。
myapp/serializers.pyを作り、このように編集します。
from rest_framework import serializers from myapp.models import Article, User class UserSerializer(serializers.ModelSerializer): class Meta: model = User class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article
REST Frameworkからserializersをimportして機能を使うことが出来ます。
ここではUserのSerializerとArticleのSerializerを作りました。
APIの作成
ここからは実際にAPIを作っていきます。
このAPIではすべての記事を取得することができます。
myapp/apis.pyを作ってこのように編集しましょう。
from rest_framework import viewsets, routers from myapp.models import Article from myapp.serializers import ArticleSerializer class ArticleViewSet(viewsets.ModelViewSet): queryset = Article.objects.all() serializer_class = ArticleSerializer router = routers.DefaultRouter() router.register(r'articles', ArticleViewSet)
REST Frameworkのviewsets.ModelViewSetを継承してSerializerを設定しています。
apis.pyはAPIの本体になります。
機能を追加したい場合は主にこのファイルに記述を追加していくことになります。
次にmySite/urls.pyを編集してアクセスすることで記事一覧を取得出来るようにしましょう。
from django.conf.urls import url, include from django.contrib import admin from myapp import apis urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^api/', include(apis.router.urls)), ]
これで全ての準備が出来ました。
このコマンドを実行してみましょう。
curl http://localhost:8000/api/articles.json
curlコマンドでJSONを取得してみると、このような結果が得られると思います。
[]
これはまだ何もデータベースに登録されていない状態です。
Django shellを使ってデータを追加してみましょう。
このコマンドを実行するとDjangoのシェルが起動します。
python manage.py shell
シェルが起動した状態でこのようなコマンドを入力していきます。
In [1]: from myapp.models import User, Article In [2]: User(name='taro').save() In [3]: User.objects.all() Out[3]: <QuerySet [<User: User object>, <User: User object>]> In [4]: user = User.objects.all().first() In [5]: Article(user=user, title='Hello.', contents='Hello Django.').save() In [6]: Article.objects.all() Out[6]: <QuerySet [<Article: Article object>]>
これでcurlコマンドでJSONを取得すると、追加したデータが取得できます。
curl http://localhost:8000/api/articles.json
まとめ
DjnagoでREST Frameworkを使ったAPIの作り方を解説しました。
RESTという設計モデルを知るためにはWebの仕組みにも触れなければなりません。
少々難しい内容かもしれませんが、これからWebを扱っていく方々にはとても役に立つ知識になると思います。
DjangoでAPIを作る場合はREST Frameworkを使うのがとても良い方法です。
Djangoのデータベースについても学びながら、APIを作ってみてください。