【Django入門】REST FrameworkでAPIを作ってみよう

こんにちは。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.pyINSTALLED_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に、myapprest_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を作ってみてください。

この記事を書いた人

侍エンジニア塾は「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。侍テック編集部では技術系コンテンツを中心に有用な情報を発信していきます。

目次