Help us understand the problem. What is going on with this article?

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

目次

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

1. 仮想環境の構築&必要なライブラリのインストール

仮想環境の作成をします。
この仮想環境上に、本アプリケーションで利用する
パッケージが入るイメージです。
こうすることで、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が出ればインストール完了です。

2. Djangoプロジェクト作成

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

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

mkdir rest_pj
cd rest_pj
django-admin startproject config .

現在のディレクトリ状態

以下にconfigというフォルダがありますが、こちらがプロジェクトの設定ディレクトリになります。

skitch.png

3. Djangoアプリケーションの作成

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

django-admin startapp api

現在のディレクトリ状態

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

dir2.png

4. 設定ファイルに追加アプリケーションを追加する

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',
    #以下の2つを追加
    'rest_framework',
    'api',
]

5. モデルの作成

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()

6. データベースの構築

Django標準のSQLite3を利用することにします。
実用性求める場合は、PostgreSQLがいいみたいですね。

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

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

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

7. 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')

8. 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

9. 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)

10.  Serverの起動

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

python manage.py runserver

11. 確認

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

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

api_root.png

http://localhost:8000/api/users/」にアクセスする。
api_get_users.png

12. 感想

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

参考

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away