DjangoでREST APIを実装するには?
DjangoでREST APIを実装するには?
2021年4月22日
Django で REST API を実装するには?
Django は基本的にバックエンドのフレームワークで、サーバー側でレンダリングを行う事ができます。しかし、場合によってはフロントエンド側で処理を行った方が良い場合も結構あります。その際、必要になるのが REST API です。この記事では Django で REST API を実装する方法を紹介します。
REST API のフレームワークを利用します!
Django で REST API をサポートする場合、REST API のフレームワークを利用するのが簡単で便利です。DJango は Web サービス・Web アプロを実装する基本的な機能は予め用意されていますが、REST API のフレームワークは別途インストールする必要があります。
インストールは、pip を利用して行います。 仮想環境が有効になっていることを確認してインストールします。仮想環境になっていないと、システム全体に適用されてしまいます。
$ pip3 install dijangorestframework
これに続いて、プロジェクトフォルダの「settings.py」にこのフレームワークを登録します。 登録は、「INSTALLED_APPS」に「rest_framework」追加します。
# Application definition
INSTALLED_APPS = [
# 'srd7.apps.Srd7AdminConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'srd7'
]
登録は以上です。
Django で REST API をサポートする場合、REST API のフレームワークを利用するのが簡単で便利です。DJango は Web サービス・Web アプロを実装する基本的な機能は予め用意されていますが、REST API のフレームワークは別途インストールする必要があります。
インストールは、pip を利用して行います。 仮想環境が有効になっていることを確認してインストールします。仮想環境になっていないと、システム全体に適用されてしまいます。
$ pip3 install dijangorestframework
これに続いて、プロジェクトフォルダの「settings.py」にこのフレームワークを登録します。 登録は、「INSTALLED_APPS」に「rest_framework」追加します。
# Application definition
INSTALLED_APPS = [
# 'srd7.apps.Srd7AdminConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'srd7'
]
登録は以上です。
Views の作成
通常のページと同じでデータ処理をしてリクエストに応答する部分の処理を「views」で行います。通常のページの記述をしている「views.py」に追加しても良いのですが、通常のページと REST API は分けておいた方が、通常のページと REST API の区別がハッキリしますし、他人がコードを見る際にも分かりやすくなります。従って、管理上は別々のファイルにわることをお勧めします。
Views 作成の例として、データベースにかす顧客リストのテーブル「Customer」がある場合を想定します。「models.py」に以下のようなクラスを作成してある場合を考えます。
from django.db import models
# Create your models here.
class Customer(models.Model):
name = models.CharField(max_length=50, help_text="The name of a customer.")
def __str__(self):
return self.name
このテーブルから登録されている顧客数を取得する API を考えます。 通常の、「views.py」の代わりに「api_views.py」をアプリのフォルダに作成します。
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Customer
@api_view()
def sample_api_view(request):
total_customers = Customer.objects.count()
return Response({"total_customers": total_customers})
これで、テーブルの全てのエントリの数を取得して、「{ "total_customers": total_customers}」というレスポンスをする処理ができます。
通常のページと同じでデータ処理をしてリクエストに応答する部分の処理を「views」で行います。通常のページの記述をしている「views.py」に追加しても良いのですが、通常のページと REST API は分けておいた方が、通常のページと REST API の区別がハッキリしますし、他人がコードを見る際にも分かりやすくなります。従って、管理上は別々のファイルにわることをお勧めします。
Views 作成の例として、データベースにかす顧客リストのテーブル「Customer」がある場合を想定します。「models.py」に以下のようなクラスを作成してある場合を考えます。
from django.db import models
# Create your models here.
class Customer(models.Model):
name = models.CharField(max_length=50, help_text="The name of a customer.")
def __str__(self):
return self.name
このテーブルから登録されている顧客数を取得する API を考えます。 通常の、「views.py」の代わりに「api_views.py」をアプリのフォルダに作成します。
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Customer
@api_view()
def sample_api_view(request):
total_customers = Customer.objects.count()
return Response({"total_customers": total_customers})
これで、テーブルの全てのエントリの数を取得して、「{ "total_customers": total_customers}」というレスポンスをする処理ができます。
URL のマッピング
通常の「views」と同様に、アプリのフォルダの「urls.py」に使用する URL と紐付けます。
from django.urls import path
from . import api_views
urlpatterns = [
path('api/total_customers/',api_views.total_customers),
]
これで一連の実装は完了です。この例では、Web ブラウザで「127.0.0.1:8000/api/total_customers」にアクセスすると、データベースの登録顧客数を取得できます。
コマンドラインから利用する場合は、
$ curl http://127.0.0.1:8000/api/total_customers/?format=json
URL だけの指定の場合、フレームワークが HTML のページを作って応答します。URL にクエリパラメータで「?format=json」を指定すると、JSON のみを返すようになります。
通常の「views」と同様に、アプリのフォルダの「urls.py」に使用する URL と紐付けます。
from django.urls import path
from . import api_views
urlpatterns = [
path('api/total_customers/',api_views.total_customers),
]
これで一連の実装は完了です。この例では、Web ブラウザで「127.0.0.1:8000/api/total_customers」にアクセスすると、データベースの登録顧客数を取得できます。
コマンドラインから利用する場合は、
$ curl http://127.0.0.1:8000/api/total_customers/?format=json
URL だけの指定の場合、フレームワークが HTML のページを作って応答します。URL にクエリパラメータで「?format=json」を指定すると、JSON のみを返すようになります。
GET 以外のメソドッドはどうする?
上の例では、HTTP の GET メソッドを使った例になります。 POST などで使いたい場合は、
@api_view(['GET','POST'])
def rest_api(request):
if request.method == 'GET':
'''HTTP GET'''
elif request.method == 'POST':
'''HTTP POST'''
URL にクエリパラメータが含まれている場合は、
@api_view()
def rest_api(request):
parameters = request.query_params
で取得できます。
上の例では、HTTP の GET メソッドを使った例になります。 POST などで使いたい場合は、
@api_view(['GET','POST'])
def rest_api(request):
if request.method == 'GET':
'''HTTP GET'''
elif request.method == 'POST':
'''HTTP POST'''
URL にクエリパラメータが含まれている場合は、
@api_view()
def rest_api(request):
parameters = request.query_params
で取得できます。
まとめ
Django のフレームワークは Python ベースで、広く利用されている、フロントエンドも含めた Javascript ベースのフレームワークに慣れている人には最初は違和感が大きいところもあるかと思います。
Python 自体は学びやすいプログラミング言語の一つで、Django も一連の仕組みを理解してしまえばあまり、大きな違いはありません。REST API が使えると、極端な話はバックエンドは Django で全て REST API で実装して、フロントエンドは、React や Vue を利用すると言うのも一つの実装方法だと思います。
いずれにしても、REST API が利用できると実装の幅が広がります。
Django を利用しようと思ったそもそものきっかけは機械学習などの Python のライブラリを利用した Web サービス・Web アプリの開発だったので、学習コストの少ない実装方法としては、バックエンドを Django で組んで、フロントエンドは React や Vue を使うと、最低限の Django の学習で機械学習を取り込んだサービスを実現できます。
Django のフレームワークは Python ベースで、広く利用されている、フロントエンドも含めた Javascript ベースのフレームワークに慣れている人には最初は違和感が大きいところもあるかと思います。
Python 自体は学びやすいプログラミング言語の一つで、Django も一連の仕組みを理解してしまえばあまり、大きな違いはありません。REST API が使えると、極端な話はバックエンドは Django で全て REST API で実装して、フロントエンドは、React や Vue を利用すると言うのも一つの実装方法だと思います。
いずれにしても、REST API が利用できると実装の幅が広がります。
Django を利用しようと思ったそもそものきっかけは機械学習などの Python のライブラリを利用した Web サービス・Web アプリの開発だったので、学習コストの少ない実装方法としては、バックエンドを Django で組んで、フロントエンドは React や Vue を使うと、最低限の Django の学習で機械学習を取り込んだサービスを実現できます。
コメント
コメントを投稿