Django REST frameworkを試してみた話


#はじめに
　Djangoに興味を持ったのは、案件で携わることがあってからのことです。
　最近では、勉強会に参加することで俄然モチベーションが上がってきました。　
　しかし、まだ資料として残しておらず、OUTPUTができていないなと思っていました。
　備忘録と他者に説明できるだけの理解が深まっているのかを確認したいという
　思いで記載します。

#環境
OS :mac os High Sierra
python: 3.7
Django: Django-2.1.3
Django Rest Framework: Djangorestframework-3.9.0


#目次
１．　仮想環境の構築＆必要なライブラリのインストール
２．　Djangoプロジェクト作成
３．　Djangoアプリケーションの作成
4．　設定ファイルに追加アプリケーションを追加する
5．　モデルの作成
6．　データベースの構築
7．　Serializerの定義
8．　Veiwの定義
9．　URL定義
10．　Serverの起動
11．　確認
12．　感想


#１．　仮想環境の構築＆必要なライブラリのインストール

仮想環境の作成をします。
この仮想環境上に、本アプリケーションで利用する
パッケージが入るイメージです。
こうすることで、OS本体側の環境が汚くなることはありません。

```
python3 -m venv rest_api
```
上記のコマンドの実行が完了したら、以下コマンドで
仮想環境を有効化状態とします。
（rest_apiという環境を有効化）

```
source rest_api/bin/activate
```

有効になると以下のようにコマンドラインの先頭に環境名が表示されます。
仮想環境が有効な状態になっているので、このあとパッケージインストールの準備をします。

```
(rest_api) mac：　
```

パッケージインストールの準備ということで、パッケージを管理するソフトウェアをUpdateする作業です。
これがないとDjangoを導入する時に怒られます。

```
pip3 install --upgrade pip
```

そして、以下のコマンドでDjangoとDjango Rest Frameworkをインストールします。

```
pip3 install Django
```
```
pip3 install Djangorestframework
```

両方ともSuccessfullyが出ればインストール完了です。

#２．　Djangoプロジェクト作成
今回のアプリケーションを作成するにあたってのプロジェクトフォルダを作成します。
このプロジェクトフォルダを作成すると、アプリケーションを管轄する全体の設定などが
行えるようになります。
以下はチュートリアルなどと作成方法が違いますが、これはプロジェクトの設定ファイルが
入るフォルダをconfigとしたくてこの方法を取っています。

以下は、「rest_pj」というプロジェクトを作成しています。

```
mkdir rest_pj
cd rest_pj
django-admin startproject config .
```
##現在のディレクトリ状態
以下にconfigというフォルダがありますが、こちらがプロジェクトの設定ディレクトリになります。

<img width="226" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/8ebae238-435d-f195-c241-e1dfb9107ebd.png">


#３.　Djangoアプリケーションの作成
続いて、アプリケーションを作成します。
apiという名前でアプリケーションを作成しました。
現段階でのフォルダ階層は以下を参照ください。

```
django-admin startapp api
```
##現在のディレクトリ状態
configフォルダと同じ階層に、apiというフォルダができていることが分かります。
このapiが一つのアプリケーションとなるので、もし今後フロント側の画面を作成したいという
ことになればフロント用のアプリケーションを作成したりすることも可能です。

<img width="236" alt="dir2.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/212ba5d1-7b60-885e-a060-8f6169d1de44.png">




#４．　設定ファイルに追加アプリケーションを追加する
Djangoに「api」「restframework」のアプリケーションを認識させる作業になります。

追加は、configフォルダ配下のファイルです。
・djangorestframework(もともとインストール作業のときに入れていたものを紐づけ)
・api（apiアプリケーションとして追加したものを紐づけ）

```settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #以下の２つを追加
    'rest_framework',
    'api',
]
```

##５．　モデルの作成
DjangoはActiveRecordモデルを採用しているため
データベース構築のために先にモデルを作成します。
apiフォルダ配下のファイルを修正します。
今回は、Userというモデルを作成することにしました。

```models.py
from django.db import models

# Create your models here.

class User(models.Model):
    name = models.CharField(max_length=32)
    email = models.EmailField()
```

##６．　データベースの構築
Django標準のSQLite3を利用することにします。
実用性求める場合は、PostgreSQLがいいみたいですね。

以下コマンドラインで実施し、データベースを作成します。

```
#データベース構築のためのmigrationファイルを作成
python manage.py makemigrations

#migrationファイルを元にデータベースを構築する
python manage.py migrate
```

##７.　Serializerの定義
Serializerは、restframeworkのモジュールでリクエストバリデーションやフィルタリングなど
やってくれるものです。
（serializerも色々実装方法があるので調べて実装してみてみることが必要そうです。）

今回の開発では、JSON形式でレスポンスを返したい　＋　Modelの定義を有効利用したいので
ModelSerializerを利用したいと思います。

Serializerをうまく使えば、劇的に開発スピードが上がりそうです。
apiフォルダ配下に以下のファイルを新規に作成します。

```serializer.py
# coding: utf-8

from rest_framework import serializers

from .models import User

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name', 'email')
```

##８．　Veiwの定義
apiフォルダ配下のviews.pyを修正します。
viewは画面にどのようなページを返すかを果たす役割があるのでここでは
どのようなデータを取ってきて、どのような形で返すかを記載しています。

```views.py

# Create your views here.

from rest_framework import viewsets

from .models import User
from .serializer import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
```

##９．　URL定義
URLディスパッチャが、以下のファイルを読み込んでapiアプリケーション配下のurl定義を
読めるように設定します。

```config/urls.py
from django.contrib import admin
from django.urls import path, include
from api.urls import router

urlpatterns = [
    path('admin/', admin.site.urls),
    #apiのurlsをインクルード
    path('api/', include(router.urls)),
]

```
以下はapiフォルダ配下にurls.pyを新規作成
Viewとの紐づけを定義します。

```api/urls.py
# coding: utf-8

from rest_framework import routers
from api.views import UserViewSet

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
```

##１０．　 Serverの起動
以下のコマンドでServerを起動します。
止めたい場合は、Ctrl + Cで止めることが可能です。

```
python manage.py runserver
```

##１１.　確認
以下のURLでアクセスしてみて確認します。
画面が表示されれば成功です。

「http://localhost:8000/api/」にアクセスする。

<img width="1321" alt="api_root.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/a40e137e-185b-a986-f72b-4d590692330f.png">

「http://localhost:8000/api/users/」にアクセスする。
<img width="1313" alt="api_get_users.png" src="https://qiita-image-store.s3.amazonaws.com/0/154145/53dbb74c-603d-413d-781a-4fc80a0ab00d.png">

##１２.　感想
簡単にアプリケーションを作成できる反面、Djangoフレームワークが何を行っているのか
要件に応じた内容に対応できるのか、もっと知る必要があることを感じました。
今後、色々触ってみて実用化できる知識・技術を蓄えて行こうと思います。
また、言語としても最近の流行りのPythonの勉強にもなるので私みたいな初心者にはいいのかもしれません。

##参考
https://docs.djangoproject.com/ja/2.1/intro/tutorial01/
https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8