この記事ではDjangoの公式チュートリアルに沿った内容で使い方を解説していきます。
今回はDjangoでAPIを作成する手順です。
環境構築
Djangoでは、DjangoRESTframeworkを使うと非常に簡単にAPIを作成する事ができます。
DjangoRESTframeworkをインストールしていきましょう。
pip3 install djangorestframework
次にDjangoRESTframeworkを使用するライブラリとして宣言します。
設定は「mysite/settings.py」に記述します。
INSTALLED_APPSにrest_frameworkを追加します。
これでDjangoRESTframeworkを使用する準備は整いました。
djangoRESTframeworkの概要
DjangoRESTframeworkでREST APIを作成するには、以下の3つを設定する必要があります。
それぞれどのように設定していくのか説明していきます。
ルーティングの設定(URL pattern)
まずルーティングをして、APIのURLとサーバプログラムを紐付けます。
ルーティングは2種類のファイルで実施し、プロジェクト全体のルーティングとアプリケーションのルーティングに分かれています。
プロジェクト全体のルーティング
プロジェクト全体のルーティングはプロジェクトディレクトリにある「 mysite/urls.py」ファイルに設定します。
URLの後ろに/apiが続く場合、アプリケーションのurls.pyの設定を参照するように設定しています。
アプリのルーティング
アプリケーションのルーティング設定は、「polls/urls.py」ファイルに設定します。
ここではrouterを使い、テーブルごとのにURLを設定しています。
api/questionでQuestionViewSet関数を呼び出すことを定義しています。
データの処理設定(Serializer)
APIで呼ばれた時にデータをJsonに変換するような処理について設定します。
設定は、「 polls/serializers.py」ファイルに記載します。
QuestionSerializerクラスに扱いたいデータのカラムを指定します。
ここでは全てのカラムを扱うように’__all__’を設定しています。
APIで処理する内容を定義(ViewSet)
APIリクエストが来た際の処理を記述していきます。
設定ファイルは「polls/views.py」です。
APIで呼び出されるQuestionViewSetを定義しています。
querysetにはQuestionテーブルの全てのレコードを格納していて、
serializer_classにはJsonで出力するためのデータを格納しています。
APIを試してみる
全ての設定が完了したので、webアプリにアクセスしてみましょう。
まず、サーバを起動します。
python3 manage.py runserver 0:8000
ブラウザからサーバにアクセス(127.0.0.1:8000/api)すると、API一覧が表示されています。
APIのURLをクリックすると個別のモデルのリストが表示されます。
ここで、HTMLフォームからapiを使ってレコードを追加することもできます。
まとめ
DjangoでwebアプリのAPIを実装しました。
APIの作成にはDjangoRESTframeworkを使い簡単に作成することができました。
APIを実装するためには大きく3つの設定が必要です。
ルーティングの設定(URL pattern)・データの処理設定(Serializer)・APIで処理する内容を定義(ViewSet)についてそれぞれ解説しました。
コメント
質問です。
サーバーを起動すると
ModuleNotFoundError: No module named ‘Question’というエラーになります。
そこで、polls/models.py にQuestionクラスを定義しなければならないと思い、他の定義を参照しながら
作ってみたのですがうまくいきません。
どのようにすればよいでしょうか。
Django 4.0.2
DRF 3.13.1
私の環境は
Python 3.6.9
Django 3.2.12
となっております。
Djangoについてあまり詳しくないため、バージョンを合わせて実施いただけると環境差異によるエラーは発生しないかと思います。
ModuleNotFoundError: No module named ‘Question’ということですが、Questionテーブルの作成はお済みでしょうか?
DBの作成についてはこちらの記事に記載しておりますので、ご参照ください。
https://nisshingeppo.com/ai/django-backend/