DjangoでRESTful APIを作る

今回はDjangoでRESTfull APIを作りたいと思います。

 

 

今回のブランチはこちら

https://github.com/dsrice/base-django/tree/API/users

概要

今回はユーザ一覧を取得できるAPIを用意することを目指します。

また、RESTful APIとして簡単に用意できるもの内容のみとします。

 

RESTful APIとは?

そもそもRESTとはREpresentational State Transferの略です。

分散システムにおける複数のソフトウェアを連携させるのに適した設計原則の

集合、考え方になります。

2000年にRoy Fielding氏によって提唱されています。

 

RESTful APIとは、パラメータを指定して特定のURLにアクセスすると、XMLJSONなどで記述されたメッセージが送られてくるようなシステム、および、そのような呼び出し規約のことをさします。

 

ボヤっとしている表現になっていますが、RESTには原則とよばれるものが4つあります。

・セッションなどの状態管理を行わず、やり取りされる情報はそれ自体で完結して解釈することができる

  ーWebではHTTP自体にはセッション管理の機構はない

・情報を操作する命令の体系が予め定義・共有されている

  ーWebではHTTPメソッドに相当

・すべての情報は汎用的な構文で一意に識別される

  -URL/URIに相当

・情報の一部として、別の状態や別の情報への参照を含めることができる(ハイパーメディア的な書式で情報を表現する)

  -HTMLやXMLに相当

 

特に注意すべきことは最初の「セッションなどの状態管理を行わず」ですね

Webサービスを作っていて、認証後のという状態を取り扱う必要性がでてきます。

セッションにいれて扱うといったことをしている方も少なくないと思いますが、

RESTの考え方ではセッションでログイン情報を管理すると原則が壊れてしまします。

Tokenなどをheaderに入れたりして扱うようにしましょう

 

今回は認証問題はいったん置いておいてAPIを作ることにします。

このような段階を踏むようにしたのは、

同時に進めた時にAPIの設定異常?トークンの認証異常?

とどちらの設定がおかしいかが、切り分けるのが大変だと考えたからです。

なので。APIを作っておき、その後認証が必要になるようにすれば

どちらがおかしいのかがわかりやすいと考えたからです。

 

APIを作る

前置きが長くなりましたが、やり方を書いていきます。

方法は以下のSTEPを記述します。

 STEP1 Serializerを作る

 STEP2 Viewを作る

 STEP3 routingを設定する

の3段階です。

 

今回はあくまでも簡単なものの用意というスタンスです。

実際の開発時はもっと複雑なことが必要になってきますが、

今回は触れません。

 

STEP1 Serializerをつくる

Serializerとは、データの入出力を扱い、モデルへの橋渡しをするものです。

DjangoにはSirializerにはいろいろなタイプが用意されています。

 

今回は、扱いやすいModelSerializerを使います。

今回は「v1」アプリケーションにAPIを追加したいので

この中に「serializers」フォルダを作成して、この中にusers.pyファイルを作成して

以下の内容記述します。

 

v1/serializers/user.py 

 
from rest_framework import serializers

from ..models import User

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

 

このSerializerに関してはまだまだ使い方に余地がありますが、

今回はこれだけで行きます。

 ModelSerializerですが、このMetaクラスは必須です。

記述を忘れないようにしましょう。

詳細を知りたい方は、こちらからどうぞ

https://note.crohaco.net/2018/django-rest-framework-serializer/

STEP2 Viewを作る

views.pyというファイルがすでにv1アプリケーション内にありますので

こちらを以下の内容に書き換えます。

 

v1/views.py
 
from django.shortcuts import render
from rest_framework import viewsets, filters

from .models import User
from .serializers.users import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
 
 Djangoではviewsetでviewを用意したりするのですが、
今回はModelViewsetを選択しました。
当然ほかにも使い方があるのですが、今回は割愛します。
 

STEP3 routingを設定する。

v1アプリケーションにurls.pyを用意します。

以下の内容を記述します。

 

v1/urls.py
 
# coding: utf-8

from rest_framework import routers
from .views import UserViewSet


router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
 
この設定で
http://localhost:8000/v1/users」にGETメソッドでアクセスすると
ユーザ一覧を取得することができます。
 
ですが、大元のbaseapiプロジェクトにv1へのroutingを設定指定なしので
こちらを設定します。
 
baseapi/urls.py
 
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

from v1.urls import router as v1_router

urlpatterns = [
    path('admin/', admin.site.urls),
    url('v1/', include(v1_router.urls)),
]
 
設定はここまでです。
ここまでできたら、
にブラウザからアクセスしてみましょう
 
すでにユーザを作っていればDBのuserにあるレコードがすべて出力されているはずです。

f:id:ds_ricekun:20200530164535p:plain

APIはこれで完成です!!!

 

ちょっとした解説

今回は簡単にAPIを作るということをテーマに書いたので細かい説明はせずに

方法に徹していました。

少しだけ解説をすると、今回の肝になっているのでModelViewSetです。

このViewSetを選択するとCRUD操作とメソッドと紐づける形で用意されます。

本来はユーザ情報を管理するには安易な手段ではありますが、

今回は解説用ということで、そこはノー突っ込みで行きたいと思います。

 

さて、メソッドとCRUD操作が紐づくというこですが、以下のようになっています。

 GETメソッド → Read URL:http://localhost:8000/v1/users

   POSTメソッド → Create URL:http://localhost:8000/v1/users

 PUTメソッド → Update(全部) URL:http://localhost:8000/v1/users/:id

 PATCHメソッド → Update(一部)URL:http://localhost:8000/v1/users/:id

   DELETEメソッド → Delete URL:http://localhost:8000/v1/users/:id

となっています。
/:idは対象のidになります。
 
また、GETメソッド時の結果を見ていただければわかりますが、
返信内容を決めているのはSerializerです。
ViewSetはURLなどの情報を管理し、対象モデルから取得した結果を
Serializerを通ってレスポンスとして返す仕組みとなっています。
 
細かい解説はまた後日にします。(すでに3500文字を超えているし・・・)
次は認証を必要になるようにJWTを使う解説です!
 
今回のブランチはこちら