【Python】Django-Rest-frameworkを使えるようにする

2019年1月27日

私はPythonでとりあえずシステムトレードを作ろうかと思っています。

その上で、機械学習とする上でどのようなシステム構成にするか考えていたのですが、REST APIが簡単かなぁと思いdjango-rest-frameworkを使用することにしました。

 

REST APIとは?

REST APIとはいわゆる「RESTful API」と呼ばれるAPIの規約の一つです。(正確にはREST>RESTfulのような範囲になりますが、現在ではREST APIといえば、だいたいRESTful APIを指すと思います)

RESTの特徴はモデル(多くの場合はDBのテーブルに紐づけたもの)にメソッドを指定し各処理を行います。メソッドは取得なら「GET」、作成なら「POST」、更新なら「PUT」、削除なら「DELETE」といった具合になります。

現在ではほとんどケースで通信にはHTTPプロトコルが使用されることが多く、HTTPのヘッダにどのメソッドであるか定義し、通信します。

たぶんもっとしっかりした定義などがあるはずですが、私の理解ではこのような感じです。

 

Django-REST-frameworkとは

djangoの拡張パッケージの一つで、djangoでREST APIを使用できるようになります。

django-rest-frameworkの導入方法は後述しますが、非常に簡単です。また、django-rest-frameworkを導入した後も通常のdjangoとしても使用できるのも良いところだと思います。

 

Django-REST-frameworkを設定する

以下のコマンドでDjango-REST-frameworkのパッケージをインストールします。

conda install -c conda-forge djangorestframework

 

通常のdjangoと同様でプロジェクトを作成します。

django-admin startproject django_server

ここも通常のdjangoと同様でアプリケーションを作成します。

python manage.py startapp api_server

 

それでは、django-rest-frameworkを有効にするために「settings.py」に記載を追加します。

アプリケーションを有効にする時に設定するINSTALLED_APPSにdjango-rest-frameworkを追加します。

INSTALLED_APPS = [
	"django.contrib.admin",
	"django.contrib.auth",
	"django.contrib.contenttypes",
	"django.contrib.sessions",
	"django.contrib.messages",
	"django.contrib.staticfiles",
	"rest_framework",
	"trade",
]

Django-REST-frameworkを使ってみる

GETメソッドを使う

ここでやるのは本当に単純なやつだけです。Serializerとかも特に使いません。

アプリケーションのurls.pyは普通のdjangoと同様の記載にすることで問題ないです。

urlpatterns = [path("hello/", apis.HelloApi.as_view(), name="test-get")]

 

お次はviews.pyの記載です。

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import statusclass HelloApi(APIView):

def get(self, request, format=None):
	return Response({"message": "hello world"}, status=status.HTTP_200_OK)

これでOKです。少しだけ内容を解説します。

  • APIとして使うクラスはAPIViewを継承します。
  • getメソッドの場合はget関数にします。これで勝手にgetメソッドと紐づけられます。
  • レスポンスにはResponseを使用し、返却する内容とステータスを定義します。

GETメソッドなのでブラウザで動作確認しました。しっかり”hello world”が帰ってきています。

 

POSTメソッドを使う

次はPOSTメソッドを試します。urls.pyはそのままで、views.pyに追記します。

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class HelloApi(APIView):
	def get(self, request, format=None):
		return Response({"message": "hello world"}, status=status.HTTP_200_OK)

	def post(self, request, format=None):
		request_data = request.data
		reqMsg = request.data["reqMsg"] + "!!"
		return Response({"message": reqMsg}, status=status.HTTP_201_CREATED)

postの関数を追加するだけでOKです。送られてきたreqMsgに!!を付けて返すだけの関数です。

上がリクエストで、下がレスポンスです。

※その他のメソッドは今後更新していきます。

まとめ

今回はdjango-rest-frameworkを使用する方法を記載しました。

django-rest-frameworkはREST APIを使用する方法として非常に簡単なのでおすすめです。