この記事では、API、Django REST API、HTTP メソッドについて知り、最後に、自分たちだけの最初の REST API アプリケーションを作成することにします。
APIとは?
APIとはApplication Programming Interfaceの略で、他のアプリケーションとインターフェースを取り、必要な時にデータや値をpull/process/pushできるようにするものです。
簡単に説明すると、APIではクライアントからのリクエストとしてデータを受け取り、それを処理し、何かを送り返します。
例えば、Facebookの検索では、クライアント、つまりユーザーがプロファイルのリクエストを送ると、サーバーはデータベースをブラウズしてプロファイルを探し、その名前を持つプロファイルのリストを返す。
CRUD演算子とHTTPメソッド
APIを使用している間、必要に応じて多くの異なる方法でサーバーにリクエストを送ることができます。
これらの異なるタイプをCRUD(create-retrieve-update-delete)と呼びます。
それぞれの操作に対応するHTTPメソッドを用意しています。
Django Forms で POST と GET を学びましたが、次は他のメソッドについて学びます。
- GET – ウェブサーバから特定の情報を取り出します (単に見るだけです)。
- POST – サーバに存在する DB に新しい情報を追加します。
- PUT – 既に存在する情報を編集するか、既に存在しない場合は新しい情報を追加します。
- DELETE – サーバーに存在するDBから情報を削除します。
次のような例で理解することができる。
例えば、椅子やテーブルなど、様々なアイテムを含むDBがあるとします。
- GET を使用すると、表示するアイテムのリストだけが得られます。
- POSTを使用します。(新しいアイテムの情報とともに)そのアイテムをDBに追加します。
- PUTを使用すると、(椅子に関する情報とともに)、すでに存在する椅子の情報を更新します。もし、以前から存在しなかったのであれば、作成するだけです。
- DELETE:を使用すると、必要な特定の項目を削除するだけです。
この記事もチェック:Djangoのモデルの作成や取得、更新、削除について解説する
REST APIとは?
REST (REpresentational State Transfer) APIは、標準的なAPIと似ています。
私たちはサーバーにリクエストを送ります。
しかし、サーバーはデータで応答するのではなく、リソースで応答するのです。
- リソースはデータですが、ここではデータの考え方が変わります。
- リソースはオブジェクト指向プログラミングに似ています。
つまり、例えば
URLのエンドポイントitem/chairを考えてみましょう。
ここで、同じエンドポイントで4つの異なる機能を持たせることができる。
- GET item/chair: アイテムのリストを取得
- POST item/chair。新しいアイテムの椅子を作成
- PUT item/chair: 椅子に関する情報を更新/編集する
- DELETE item/chair: アイテムから椅子を削除
したがって、これはアイテムリソースと考えることができる。
したがって、サーバとのやりとりは、個々のエンドポイントリクエストではなく、リソース(異なる機能に対して同じエンドポイントを持つ)と考えることができるようになった。
また、Rest APIのもう一つの特徴は、ステートレスであることだ。
これは例によって説明します。
例えば、新しい椅子に関するデータを投稿すると、サーバーはその情報をDBに追加します。
一度追加されると、サーバーはそのことを忘れてしまう。
ここで、私がその椅子のGETリクエストをサーバーにぶつけると、サーバーは前回のインタラクションでその椅子を保存したばかりであることを思い出さない。
再びDBに戻り、椅子というアイテムを検索し、情報を返します。
情報を返した後は、また忘れてしまいます。
クライアントとサーバーのAPIインタラクションにおけるJSONの使用
APIは、リクエストの受け付けと返信にJSONテキストを使用します。
つまり、Twitterで特定のツイートを検索する場合、リクエストをJSONとしてサーバーに送ります。
サーバーはそれを処理した後、再びJSONテキストとしてResponseを送り返す。
このJSONのResponseは、ユーザーが読める形式に変換される。
APIにおけるFRONT-ENDとBACK-ENDのサーバー間の実際の情報交換は、JSONテキストを使って行われます。
JSONテキストは、Pythonの辞書と同じように見えます。
{“item”: { “chair”: {
“Price”: 120 ,
“Color”: 'red' ,
},
}
} |
DRF-Django Rest API Framework のインストール
さて、Django REST API を使うには、Django Rest フレームワークと呼ばれるフレームワーク全体が必要です。
Django をインストールしたときと同じように、pip コマンドを使用してこれを環境にインストールする必要があります。
シェルで次のように入力します。
pip install djangorestframework
|
django-admin startapp itemsapp |
これでインストールは完了です。
POSTMANのインストール
POSTMAN は使いやすいプラットフォーム API 開発ツールです。
Postman の機能は API 構築の各ステップを簡素化し、コラボレーションを効率化するので、より良い API をより速く作成することができます。
postmanをダウンロードするには、以下の手順に従います。
- ブラウザでPOSTMAN downloadと検索します。
-
- 最初のリンクをクリックする
- POSTMANの無料版をダウンロードする
- 手順に従い、インストールする
class ItemModel(models.Model):
id = models.IntegerField(primary_key = True )
name = models.CharField(max_length = 80 , blank = False )
price = models.IntegerField
class Meta:
ordering = [ 'name' ]
def __str__( self ):
return f "{self.name}:{self.price}"
|
以上です。
これで準備は完了です。
from rest_framework import serializers
from .models import ItemModel
class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = ItemModel
fields = [ 'id' ,name ',' price']
|
ダウンロードしてシステムにインストールすると、このように表示されます。
新しい Django REST API アプリケーションを作成する
では、リスト内のアイテムを見たり、追加、更新、削除できる Django REST API アプリケーションを作成しましょう
- ITEM APP という名前の新しいアプリケーションを作成します。
- models.py でモデルを作成します。
- Serializers.py
- ビュー(Views).py
- Urls.py
- ポストマンヒット
1. 新しい Django アプリ – itemsapp を作成する
Django Hello World App で学んだ方法で、プロジェクト内に新しい Django アプリを “itemsapp” という名前で作成します。
from django.shortcuts import render,HttpResponseRedirect,Http404
from rest_framework.parsers import JSONParser
from django.http import HttpResponse,JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import ItemsModel
from .serializers import ItemSerializer
# Create your views here. |
アプリを作成したら、基本的なステップを実行します。
- プロジェクトの urls.py を app のものにマップします。
- settings.py にアプリ名を追加する
- etc. Django app の記事にある手順を実行します。
この記事もチェック:Python Djangoのアプリ構成とプロジェクト構成を分かりやすく解説
2. アイテムのリストを持つモデルitemModelを作成します。
models.py で、item に必要なすべての情報を持つモデルを、図のように作成します。
@csrf_exempt def ItemsView(request):
if request.method = = 'GET' :
items = ItemsModel.objects. all ()
serializer = ItemSerializer(items, many = True )
return JsonResponse(serializer.data, safe = False )
elif request.method = = 'POST' :
data = JSONParser().parse(request)
serializer = ItemSerializer(data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data,status = 201 )
return JsonResponse(serializer.errors,status = 400 )
|
モデルの準備ができたので、今度は
@csrf_exempt def ItemView(request,nm):
try :
item = ItemsModel.objects.get( id = nm)
except ItemsModel.DoesNotExist:
raise Http404( 'Not found' )
if request.method = = 'GET' :
serializer = ItemSerializer(item)
return JsonResponse(serializer.data)
if request.method = = 'PUT' :
data = JSONParser().parse(request)
serializer = ItemSerializer(item,data = data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status = 400 )
if request.method = = "DELETE" :
item.delete()
return HttpResponse(status = 204 )
|
3. アプリにSerializers.pyを作成する
さて、APIはJSONテキストを扱うので、DBの情報をユーザに渡すときは、まずJSONに変換し、その逆も行う必要があります。
そのために、serializers.pyファイルが必要です。
アプリケーション内で、”serializers.py “を新規に作成し、以下の情報を追加してください。
path ( 'items/' , ItemsView),
path( 'item/<int:nm>/' , ItemView),
|
ここでは、DBのデータをJSONに変換してユーザーに送る必要があるため、シリアライザーをモデルにリンクしています。
つまり、基本的にシリアライザーはシリアライザー (DB 情報を JSON に変換する) とデシリアライザー (ユーザから与えられた JSON を Django で読める構文に変換する) の両方として機能するのです。
admin.site.register(ItemModel) |
シリアライザがどのように働くかについては、View を作成する際に詳しく学びます。
4. アイテム一覧を表示するAPI Viewの作成
Views.py に、以下のコードを追加します。
python manage.py makemigrations python manage.py migrate |
APIビューを作成するために、上記のインポートが必要です。
GETメソッドでDBにあるアイテムのリストを表示し、POSTメソッドで新しいアイテムをリストに追加するItemsViewを作成します(エンドポイント:items/)。
以下のコードを views.py ファイルに追加します。
python manage.py runserver |
ここに
- @csrf_excempt は Django Forms で学習した {% csrf_token %} に似たデコレータです。このデコレータは、渡される情報に対して偽造が起きないようにします。
- さて、もしリクエストが GET ならば、DB に存在する全てのオブジェクトを items 変数に格納します。
- 次に、シリアライザーを使って、(itemsに格納されている)特定の情報をJSON形式に変換します。DBからすべてのオブジェクトを取得したので、manyをTRUEに設定します。
- 情報がJSONに変換されたら、適切なJSONレスポンスを返します。
- POST メソッドでは、ユーザが送信する情報は JSON 形式なので、正しい Python-Django の読みやすい構文に変換する必要があります。
- そこで JSONParser を使ってリクエストを解析し、新しいアイテムに関連するデータを取得し、変数 data に格納します。
- そして、シリアライザーを使って、リクエストから得たパースされた JSON テキストを Python で読める構文に変換します。
- ここで、解析されたシリアライズデータが有効であれば、それを保存し、そうでなければエラーメッセージを表示します。
ここで、もう一つのAPI View ItemView(endpoint: item/)を追加します。
これは、GETリクエストで特定のアイテムを表示するものです。
POSTリクエストで情報を変更し、DELETEリクエストで削除できるようにする予定です。
同じviews.pyに、以下のコードを追加します。
ここで
- ここで、@csrf_exempt, デコレーターを使用しています。
- この関数の中で、まずエンドポイントで使用されたidを持つアイテムを(DBから)取得しようとします。
- もし、そのようなアイテムが存在しなければ、Http404(not found)エラーを発生させます。
- メソッドが GET の場合、シリアライザーを使って DB から JSON 形式に変換し、その JSON 応答をユーザーに返します。
- メソッドがPUTの場合、リクエストを解析してJSONデータを取得し、シリアライザーに送信してPythonで読める構文に変換します。
- シリアライザでは、パースされたデータと共に、アイテムも渡す必要があることに注 意してください。
- もしメソッドが DELETE ならば、DB から特定のアイテムを削除します。
以上です! シリアライザーを理解するのが難しくても心配しないでください。
次に、2つのViewに対応するためにurls.pyを変更します。
この記事もチェック:DjangoでのCookiesの作り方|設定や取得、有効期限について解説する
5. urls.pyで2つのViewのURLマッピングを作成する
urls.pyに、2つのAPI Viewを適切なエンドポイントにリンクさせるためのpath関数を追加します。
したがって、urls.pyに以下を追加します。
Django の URL マッピングで、URL をマッピングすることを学びました。
また、Django Admin site で学習したように、以下のコードを使ってモデルを管理サイトに登録します。
これで完了です。
あとは、DBにItemModelテーブルを作成するためのmigrationを行う必要があります。
そこで、Shellで、次のように入力します。
テーブルが作成されたら、サーバーを実行する準備ができました。
管理画面に移動して、先ほど作成した ItemModel にいくつかの要素を追加します。
この記事もチェック:Djangoで管理画面を作る方法を詳しく解説していく
POSTMAN を使ってエンドポイントを表示する
先ほどダウンロード・インストールしたPOSTMAN API開発環境を利用してみましょう。
1. GET items/
検索URLに “hostwebsite/items “と入力し、左側のメソッドをGETのままにしておきます。
送信を押して、以下を観察してください。
DBに存在するアイテムのリストについての情報を得ることができました。
2. POSTアイテム/
ここで、下にボディオプションが表示されます。
そこに行き、テキストをJSONにすることを選択し、下の与えられた場所に、あなたが追加したいアイテムに関する情報を入力します。
メソッドをGETからPOSTに変更し、送信をクリックします。
これで、アイテムがDBに取り込まれました。
3. GET item/id
ここで、検索URLのエンドポイントitem/に移動して、欲しいidを入力します。
メソッドはGETのまま、送信を押してください。
その項目に関する情報が表示されます。
4. PUT アイテム/ID
POSTの場合と同様に、既存のアイテムの情報を書き込んでから、メソッドをPUTに変更して送信を押してください。
情報が更新されたことがわかります
4. アイテム/IDを削除する
メソッドをDELETEに変更し、送信をクリックします。
これで、特定の項目が削除されたことが確認できます。
まとめ
Django REST API チュートリアルは以上です! Django REST Framework の基本的な部分とその使い方をすべて理解していただけたでしょうか。
また、公式ドキュメントから Django REST Framework についてより詳しく学ぶことができます。
Django のトピックに関するより高度なチュートリアルにご期待ください!