MENU

Django Ninjaチュートリアル①(基本事項)

Django-Ninjaチュートリアル①(基本事項)
目次

前提条件

今回から、Django Ninjaのチュートリアルを進めていきます。
前提として、前回用意した実行環境を構築している前提で進めていきますので、まだ環境構築ができていない場合は、こちらの記事を読んで、環境構築をしてから、読み進めてください。

それでは始めていきましょう。

簡単な例でDjango Ninjaを使ってみる

Django Ninjaとは

Django Ninjaとは、

Django Ninja is a web framework for building APIs with Django and Python 3.6+ type hints.

Django Ninjaは、DjangoとPython3.6以降の型ヒントに基づきAPIを構築するWebフレームワークです。

https://django-ninja.rest-framework.com/

とされています。

また、Django Ninjaの特徴として、

Easy: Designed to be easy to use and intuitive.
→使いやすく、直感的に操作できるように設計されています。

FAST execution: Very high performance thanks to Pydantic and async support.
Pydantic非同期サポートのおかげで非常に高いパフォーマンス。

Fast to code: Type hints and automatic docs lets you focus only on business logic.
→タイプヒントと自動ドキュメント生成により、ビジネスロジックの構築のみに集中できます。

Standards-based: Based on the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema.
→オープンな標準API(OpenAPI (以前は Swagger と呼ばれていました) とJSON Schemaに基づいています。

Django friendly: (obviously) has good integration with the Django core and ORM.
→(明らかに)DjangoコアとORMとの統合が良好です。

Production ready: Used by multiple companies on live projects
→ライブプロジェクトで複数の企業で使用されています。 

https://django-ninja.rest-framework.com/

とされています。

appの作成

まずはアプリケーションを作成して、そのディレクトリの中で設定を書いていきます。

初めにdocker-compose upした状態で、別のターミナルから以下のコマンドを実行し、アプリケーションを作成します。

docker-compose run backend python manage.py startapp example

ここではexampleというアプリケーションを作成し、Django Ninjaのチュートリアルを進めていきます。

settings.pyへの追記

次に、作成したexampleアプリケーションをプロジェクトディレクトリのsettings.pyに読み込ませます。

# Application definition

INSTALLED_APPS = [
  'example.apps.ExampleConfig', # add
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

上記のように記述し、作成したexampleアプリケーションをプロジェクトに認識させます。

最後に、マイグレーションさせるため、docker-compose upをした状態で、別のターミナルから以下のコマンドを実行し、マイグレートしてください。

docker-compose run backend python manage.py migrate

これでアプリケーションの設定は完了です。

Django NinjaによるAPIの作成

ここからはexampleアプリケーションディレクトリでDjango NinjaによるAPIの作成をしていきます。

アプリケーションはsettings.pyで読み込ませる必要がありますが、Django NinjaによるAPIの作成においては、Django Ninjaそれ自体をsettings.pyINSTALLED_APPSに読み込ませることは不要です。

それでは、app/backend/example/api_v1.pyを作成し、以下のように記述します。

from ninja import NinjaAPI

app = NinjaAPI(
  title = "Django Ninja Sample App",
  version = "1.0.0"
  ) # add

# add
@app.get("/hello")
def add(request):
  return {"Hello": "world"}

この段階での書き方はFastAPIとほとんど同じです。

urls.pyへの記述

プロジェクトディレクトリのurls.pyexampleアプリケーションで設定したapi_v1.pyを読み込みます。

これだけで、実質、APIの設定は完了です。

from django.contrib import admin
from django.urls import path
from example.api_v1 import app # add

urlpatterns = [
  path('admin/', admin.site.urls),
  path("api/", app.urls), # add
]

この状態で、ファイルを保存し、http://127.0.0.1:8000/api/docsにアクセスしてみましょう。

{"Hello": "world"}

上記のように表示されれば成功です。

また、http://localhost:8000/api/docsにアクセスすると、SwaggerUIで生成されたOpenAPIが見れます。

OpenAPIへのアクセス

クエリ文字列から情報を受けて表示を切り替える

app/backend/django_app/api_v1.pyに以下のように追記します(「# add 2」参照)

from ninja import NinjaAPI

app = NinjaAPI(
  title = "Django Ninja Sample App",
  version = "1.0.0"
  ) # add

〜略〜

# add 2
@app.get("/hello_for_you")
def add(request, name = "your_name"):
  return f"Hello {name}"

ここでは、nameという引数を持たせ、URLでクエリパラメータとして任意の文字列を渡しています。

これにより、返されるJSONを動的に変化させることができます。

それでは、http://127.0.0.1:8000/api/hallo_for_you?name=you:にアクセスしてみましょう。

すると、nameの部分が?以降に指定した文字列になっていると思います。
これがクエリパラメータの使用方法になります。

型の設定

Django Ninjaでは、Pythonの型アノテーションを利用して、入力される値の型を指定することができます。
型の指定がない場合は、デフォルトでString型と見なされます。

試しに以下のように設定してみます(「# add 3」参照)。

from ninja import NinjaAPI

app = NinjaAPI(
  title = "Django Ninja Sample App",
  version = "1.0.0"
  ) # add

〜略〜

# add 3
@app.get("/math")
def get_result(request, a: int, b: int):
  return {"add": a + b, "multiply": a * b}

http://127.0.0.1:8000/api/math?a=2&b=3にアクセスすると、加算と乗算の結果が下記のようにそれぞれJSONで返されます。

{"add": 5, "multiply": 6}

そして、このとき、a及びbは引数の指定の際に、「int型」を指定しています。
このため、addまたはmultiplyで返される値はint型で処理され、エラーが出ることなく、計算結果が返ってきます。

例えばこれがa=youなどなっている場合、int型に一致しないため、エラーが返されます。

また、上記の例はPythonの構文と同じ構文によってパスパラメータを宣言しているものです。
こういった書き方もできます。

この場合、パスパラメータでの文字列はクエリパラメータからではなく、引数として関数に渡されることになります。

リクエストボディからの入力

HTTPPOSTメソッドを使うため、リクエストボディから引数を受け取ることとします。

まずは、下記のとおり、リクエストボディからの値を受けるためのSchemaを設定します。

Schemaとは、
扱う値の型を定義したものです。
その他デフォルト値なども設定できます。

from ninja import Schema

class HelloSchema(Schema):
  name: str = "world"

これは、HelloSchemaというスキーマを定義し、その中でnameという引数を持たせ、str型を指定しています。

これにより、基本的にnamestr型で値を受けることになります。
次に、このSchemaapi_vi.pyで読み込み、POSTメソッドが実行できるように設定します(「# add 4」参照)。

from ninja import NinjaAPI

from django_app.models.api_v1_schema import HelloSchema # add

app = NinjaAPI(
  title = "Django Ninja Sample App",
  version = "1.0.0"
  ) # add

〜略〜

# add 4
@app.post("/hello_post")
def hello(request, data: HelloSchema):
  return f"Hello {data.name}"

この状態で、http://127.0.0.1:8000/api/docsに入り、以下のような画面が出て来れば成功です。

POSTメソッドの設定結果


また、緑色の「POST」のAPIから「Try it out」により文字列を変えて、「EXECUTE」すると、毎回文字列が変わることが確認できると思います。
このように、リクエストボディから値を受け取り、動的に返すことができます。

最後に

今回はここまでです。

簡単な設定で、Djangoの中でWebAPIが作れました。

また、OpenAPIを用いた見やすいdocsも用意されており、フロントエンドエンジニアとの同時並行の開発もできそうなUIが提供されています。

今回は初歩的な設定を簡単に行いました。
次回は、レスポンスの処理等についてやっていく予定です。

次回も読んでいただければと思います。

Django-Ninjaチュートリアル①(基本事項)

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

はじめまして、ふじです。
Python、Django、FastAPI、React.js、Next.jsを学習している、ずっと文系のプログラミング独学者です。

目次