【Django入門】djangoでRESTfull APIを簡単に作ってみる〜メモアプリを例に〜

今回はDjango REST frameworkを使ってRESTfull APIを作ってみようと思います。

前回同様、メモアプリのREST frameworkを作っていきます。

基本的には参考文献通りです。

環境構築

pipenv install
pipenv install django
pipenv install djangorestframework
pipenv shell

django-admin startproject memo_sample .
cd memo_sample

実装

Memoアプリの作成

次にmemoアプリを作成します。

python manage.py startapp memos

rest_frameworkライブラリと作成したメモアプリをプロジェクトに登録します。

# 省略
INSTALLED_APPS = [
    # 省略
    'rest_framework',
    'memos.apps.MemosConfig',
]

Memoモデルの作成

メモモデルを作成します。

from django.db import models

class Memo(models.Model):
    text = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.text

    class Meta:
        ordering = ['created_at']

MySQLの設定

ちょっと今回はDBをMySQLにしてみます。
(もし、DBにこだわらない場合この設定はいりません。)

pip install pymysql

manage.pyかsetting.pyの一番上に

import pymysql
pymysql.install_as_MySQLdb()
省略

setting.pyに

省略
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 変更
        'NAME': 'database_name', # プロジェクトで使用するデータベース名
        'USER': 'root', # パソコンにインストールしたMySQLのユーザー名
        'PASSWORD': '', # 同上。そのパスワード
    }
}
省略

設定を終えた段階でDBに反映します。

python manage.py makemigrations memos
python manage.py migrate

モデルのシリアライザーの作成

次にメモモデルのシリアライザーを定義します。

from rest_framework import serializers
from memos.models import Memo

class MemoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Memo
        fields = ['id', 'text', 'created_at']

では、作成したモデルを使って遊んでみます。

from memos.models import Memo
from memos.serializers import MemoSerializer
memo = Memo(text="memo_text1")
memo.save()
serializer = MemoSerializer(memo)
serializer.data
#=> {'id': 1, 'text': 'memo_text1', 'created_at': '2020-01-26T08:41:54.048415Z'}

Viewの作成

次にviewを書いていきます。

from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from memos.models import Memo
from memos.serializers import MemoSerializer

@csrf_exempt
def memo_list(request):

    if request.method == 'GET':
        memos = Memo.objects.all()
        serializer = MemoSerializer(memos, many=True)
        return JsonResponse(serializer.data, safe=False)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = MemoSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data, status=201)
        return JsonResponse(serializer.errors, status=400)

@csrf_exempt
def memo_detail(request, pk):

    try:
        memo = Memo.objects.get(pk=pk)
    except Memo.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = MemoSerializer(memo)
        return JsonResponse(serializer.data)

    elif request.method == 'PUT':
        data = JSONParser().parse(request)
        serializer = MemoSerializer(memo, data=data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

    elif request.method == 'DELETE':
        memo.delete()
        return HttpResponse(status=204)

最後にurls.pyの設定を行います。

from django.urls import path
from memos import views

urlpatterns = [
    path('memos/', views.memo_list),
    path('memos//', views.memo_detail)
    ]

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('', include("memos.urls")),
]

遊んでみる

ここまで書き終わったらAPIサーバーを起動し試してみます。
まずは以下のコマンドでAPIサーバーを起動します。

python manage.py runserver

次にこのAPIサーバーにリクエストを送ってみます。
そのためにhttpieというライブラリを用います。

sudo apt-get install httpie

まずはメモ一覧の取得

http http://127.0.0.1:8000/memos/

HTTP/1.1 200 OK
Content-Length: 78
Content-Type: application/json
Date: Sun, 26 Jan 2020 09:03:33 GMT
Server: WSGIServer/0.2 CPython/3.6.0
X-Frame-Options: SAMEORIGIN

[
    {
        "created_at": "2020-01-26T08:41:54.048415Z",
        "id": 1,
        "text": "memo_text1"
    }
]


次にあるメモの内容の取得

http http://127.0.0.1:8000/memos/1/

HTTP/1.1 200 OK
Content-Length: 76
Content-Type: application/json
Date: Sun, 26 Jan 2020 09:04:40 GMT
Server: WSGIServer/0.2 CPython/3.6.0
X-Frame-Options: SAMEORIGIN

{
    "created_at": "2020-01-26T08:41:54.048415Z",
    "id": 1,
    "text": "memo_text1"
}

参考文献

https://www.django-rest-framework.org/
タイトルとURLをコピーしました