Django REST framework のチュートリアルやってみた①

環境

  • macOS Catalina 10.15.4
  • Python 3.8.1
  • Django 2.2
  • djangorestframework 3.11.0

Django REST framework のインストールは以下のコマンドでできます。

pip install djangorestframework

早速始めていきましょう!!

事前準備

Djangoのプロジェクトを作ります。

django-admin startproject tutorial
cd tutorial

次にアプリです。今回はブログっぽいアプリを作るという感じで話を進めていきます。

django-admin startapp blog

今こんなフォルダ構成です。(余計なのは消してます)

.
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── manage.py
└── tutorial
    ├── settings.py
    ├── urls.py
    └── wsgi.py

tutorial/settings.pyにアプリを追加します。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'rest_framework', # 追加

    'blog' # 追加
]

modelの作成

blog/models.py

from django.db import models


class Blog(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

今回modelはこのように作成しました。ブログの記事のタイトル、内容、作成日時を持ちます。modelがかけたらmigrateします。

python manage.py makemigrations
python manage.py migrate

serializerの作成

blog内に新たにserializers.pyファイルを作成します。

from rest_framework import serializers
from .models import Blog


class BlogSerializer(serializers.ModelSerializer):
    class Meta:
        model = Blog
        fields = ['id', 'title', 'content']

シリアライズするというのは、モデルをjson形式にして返す。というような意味合いだと認識しています。ModelSirializerを継承することで、簡単にモデルをシリアライズできるクラスを作成できます。ここのfieldsに指定した値をjson形式にして返してくれます。

ついでにadmin.pyを編集して管理画面でBlogモデルをいじれるようにしておきます。

from django.contrib import admin

from .models import Blog


admin.site.register(Blog)

runserverをしてテストデータを5つほど追加します。

viewの作成

次にviewの作成です。blog/views.pyを次のようにします。

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Blog
from .serializers import BlogSerializer

@api_view(['GET', 'POST'])
def blog_list(request, format=None):
    if request.method == 'GET':
        blog = Blog.objects.all()
        serializer = BlogSerializer(blog, many=True)
        return Response(serializer.data)

    elif request.method == 'POST':
        serializer = BlogSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['GET', 'PUT', 'DELETE'])
def blog_detail(request, pk, format=None):
    try:
        blog = Blog.objects.get(pk=pk)
    except Blog.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = BlogSerializer(blog)
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = BlogSerializer(blog, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        blog.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

今回は関数ベースビューを使いました。クラスベースビューを使うともっと簡単に実装できるのですが、関数ベースビューの方が何をしているのかわかりやすいので採用しました。

urlの作成

次にurlとviewを紐付けします。

tutorial/urls.pyを次のように書き換えます。

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
]

admin以外のURLにリクエストした場合はblogアプリ内のurlにviewを探しにいきます。

blogアプリ内に新しくurls.pyを作成し、次のように書きます。

from django.urls import path
from .views import blog_list, blog_detail

urlpatterns = [
    path('blog/', blog_list),
    path('blog/<int:pk>/', blog_detail),
]

動作確認

ブラウザ編

runserverをしてlocalhost:8000/blogにリクエストすると以下のような画面になるはずです。

またlocalhost:8000/api/blog/1のようなurlにリクエストすると、それぞれのデータが返ってきます。

ターミナル編

runserverしているのと別のターミナルを用意してこちらからurlにリクエストを投げて動作確認することもできます。以下のコマンドを実行してください。

pip install httpie

次にurlにリクエストしてみます。するとjsonでレスポンスが返ってきます。

http http://127.0.0.1:8000/blog/

また以下のコマンドでレスポンスの形を変えることができます。

http http://127.0.0.1:8000/blog.json
http http://127.0.0.1:8000/blog.api

さらにPOSTでリクエストをすることで、データを新しく追加することもできます。

http --form POST http://127.0.0.1:8000/blog/ title="test6" content="post from terminal"

参考

1 - Serialization - Django REST framework
Django, API, REST, 1 - Serialization
2 - Requests and responses - Django REST framework
Django, API, REST, 2 - Requests and responses
Django REST Frameworkを使って爆速でAPIを実装する - Qiita
この記事は「Python その2」Advent Calendar 2015の14日目です。 何を書こうか迷ってましたが、今年学んだPython関係の技術で一番恩恵を預かったREST Frameworkについて書いてみようと思います...

続きはこちら

コメント

タイトルとURLをコピーしました