【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クライアントを作ることが出来るようになります。

詳しくはこちらの記事をご覧ください。

いまさら聞けない!APIとは何か?〜基礎の基礎を学ぼう〜
更新日 : 2019年6月26日

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についての詳しい解説はこちらの記事をご覧ください。

【Django入門】Djangoアプリの設計哲学!MTVモデルをmodelsを通して学ぼう!
更新日 : 2019年1月29日

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を作ってみてください。

LINEで送る
Pocket

SEからWebエンジニアへ転職した理由

侍エンジニア塾卒業生の小池さんは、以前は社内SEとして約5年ほど勤務していました。しかし業務内容は社内のヘルプデスク対応など、プログラムを書く仕事は全くなかったそうです。

SEながらプログラムを書けない現状に「将来仕事がなくなるんじゃないか」と不安を感じ、プログラミング学習を決意。

弊社スクールで学習し、無事ベンチャー企業のプログラマーとして転職に成功しました。そんな小池さんの学習法や転職体験談を伺いましたので、是非ご覧ください。

「プログラミングができないSEは仕事がなくなる」不安を感じたSEが未経験から転職成功するまで
更新日 : 2019年10月7日

書いた人

ryo

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説