ホーム >  AWS >  【API】DRFのアプロダ作成 その①シリアライザを作る【Django】

投稿日:   |  最終更新日:

【API】DRFのアプロダ作成 その①シリアライザを作る【Django】

AWSDjangoDjango REST frameworkPython

DRFを使ったアップローダーアプリケーションを作成するためシリアライザを定義します。

シリアライザーの作成

前回、DRFアプリケーションを作成し、モデルを作成しました。今回は、REST APIではJSONやXMLなどでデータのやり取りをしていくことになります。例えば、前回作ったCompositeモデルのデータを一つ作りたいならば、作成用のURLに対して、次のようなJSONを送信できます。

{
    "name":"secret",
    "is_dir":true,
}

データ一覧用のURLにアクセスした場合、下記のようなJSON等がブラウザに返却されます。

[
    {
        "name":"dir1",
        "is_dir":true,
    },
    {
        "name":"dir2",
        "is_dir":true,
    },
    {
        "name":"dir3",
        "is_dir":true,
    }
]

作業の流れ

mac側

1.VSCODEを起動します。

サンドボックス(Vagrant側)

1.vagrantを起動して、Amazon Linux2にログインします。

2.Djnangoプロジェクトを作成したディレクトリへ移動します。

前回まで

今回の作業は、以下の続きです。

【仮想環境】MacにVirtualBoxをインストール【Mac】

【Vagrant】MacにAWS公式のAmazon Linux2 Vagrant 環境を作成【オンプレミス】

【Vagrant】MacにAWS公式のAmazon Linux2 Vagrant Boxを作成、起動【オンプレミス】

Vagrant】Macに用意したVagrantのAmazon Linux2 環境にVirtualBox Guest Additionsをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にPythonをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にuwsgi、Django、Django Restframeworkをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にsqlite3、nginxをインストール【オンプレミス】

【Vagrant】Macに用意したAmazon Linux2 環境にDjangoプロジェクト作成【オンプレミス】

【Vagrant】DRFアプリケーション作成、テスト起動【Django】

※今回の記事は、既にAmazonLinux2のVagrant環境を作成済みであるとします。

環境

私のPC環境は以下の通りです。

PC MacBook Air (Retina, 13-inch, 2019)
CPU 1.6 GHz デュアルコアIntel Core i5
メモリ 16 GB 2133 MHz LPDDR3
OS 10.15.2
VirtualBox 6.1.12r139181
Vagrant 2.2.9

仮想環境

仮想環境は以下の通りです。

OS Amazon Linux release 2 (Karoo)
Python 3.7.9
Django 3.2
djangorestframework 3.12.4
djangorestframework-jwt 1.11.0
django-cleanup 5.2.0
uWSGI 2.0.19.1
Nginx 1.18.0
Sqlite3 1.18.0

Vagrantのディレクトリ構成

  • ~/Work/
  • Vagrant/
  • AmazonLinux2/


AmazonLinux2仮想環境へログイン

①「ターミナル」を開いて下記のコマンドを入力します。

cd ~/Work/Vagrant/AmazonLinux2

②下記のコマンドを入力して仮想環境を起動します。

Vagrant up

③下記のコマンドを入力してログインします。

vagrant ssh

シリアライザの記述

①以下のようなDjangoアプリ構成を作ります。プロジェクト名が「config」で、アプリケーション名が「nuploader1」です。プロジェクトの設定は済ませたものとします。赤字のファイルは、今回変更する部分です。

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • nuploader1/
  • __init__.py
  • __pycache__
  • migrations
  • models.py
  • serializers.py
  • urls.py
  • views.py
  • templates
  • db.sqlite3
  • manage.py

②nuploader1/serializers.pyに以下の内容を記述します。

from rest_framework import serializers
from .models import Composite


class CompositeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Composite
        fields = ('pk', 'name', 'is_dir', 'src', 'parent', 'zip_depth')

解説

DRFのシリアライザとは、データの相互変換をします。JSON等を送るとそれをモデルに変換したり、モデルを基にJSON等を作ったりします。通常のDjangoで言うと、フォームと似たことを行います。


ビューの作成

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • nuploader1/
  • __init__.py
  • __pycache__
  • migrations
  • models.py
  • serializers.py
  • urls.py
  • views.py
  • templates
  • db.sqlite3
  • manage.py

①nuploader1/views.pyに以下の内容を記述します。

from rest_framework import viewsets
from .models import Composite
from .serializers import CompositeSerializer


class CompositeViewSet(viewsets.ModelViewSet):
    queryset = Composite.objects.all()
    serializer_class = CompositeSerializer
 

解説

ModelViewSet

class CompositeViewSet(viewsets.ModelViewSet):

DRFで使えるビューは様々ですが今回は、viewsets.ModelViewSetです。のdjango.views.genericのListView、DetailView、CreateView、UpdateView、DeleteViewが1つになったイメージです。モデルに対する、一覧取得、詳細取得、新規作成、更新、削除を一括で作成してくれます。


URLの作成

  • mysite/
  • config/
  • __init__.py
  • settings.py
  • urls.py
  • wsgi.py
  • nuploader1/
  • __init__.py
  • __pycache__
  • migrations
  • models.py
  • serializers.py
  • urls.py
  • views.py
  • templates
  • db.sqlite3
  • manage.py

①nuploader1/urls.pyに、以下のようにします。

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views

app_name = 'nuploader1'

router = DefaultRouter()
router.register(r'composites', views.CompositeViewSet, basename='composites')

urlpatterns = [
    path('api/', include(router.urls)),
]

解説

router = DefaultRouter()

「DefaultRouter class」のインスタンスをrouterに代入します。viewsets.ModelViewSetは幾つかのビューがまとまったようなものです。それらの各ビューと各URLをマッピング(関連付)するような処理をしているものと考えるとわかりやすいです。

router.register(r'composites', views.CompositeViewSet, basename='composites')

仮想サブクラスとして登録します。

  • 第一引数・・・prefix – URLのプレフィックス(接頭辞)。
  • 第二引数・・・viewset – viewset classを指定。
  • 第三引数・・・basename – 作成されるURL名に使用するベース。

もし、base_name設定されていない場合、veiwsetのmodel、またはqueryset属性を元に自動的に生成されます。


Browsable API

Djangoに管理サイトが付属しているように、Rest frameworkにもBrowsable APIという便利な機能があります。

①runserverで起動し、「http://192.168.33.10:8000/uploader/api/」にアクセスします。

②runserverで起動し、「http://192.168.33.10:8080/uploader/uploader/api/composites/」とあるので、リンクをクリックします。

データの一覧が表示されていて、実際にデータを投入することもできます。

③試しにPOSTボタンを押して送信します。作ったデータの内容が表示されます。

上にある「Composite List」のリンクをクリックして一覧に戻ります。

④「http://192.168.33.10:8080/uploader/uploader/api/composites/1」のように、URLにデータのpkを入れます。すると以下のように、対象のデータの内容と、更新用フォームと、削除ボタンが表示されます。

次回

アプロダのディレクトリを入れ子構造に改造します。

【API】DRFのアプロダ作成 その②ディレクトリを入れ子にする【Django】


トラックバック用のURL
プロフィール

名前:イワサキ ユウタ 職業:システムエンジニア、ウェブマスター、フロントエンドエンジニア 誕生:1986年生まれ 出身:静岡県 特技:ウッドベース 略歴 20

最近の投稿
人気記事
カテゴリー
広告