前提条件
今回から、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.py
のINSTALLED_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.py
でexample
アプリケーションで設定した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が見れます。
クエリ文字列から情報を受けて表示を切り替える
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の構文と同じ構文によってパスパラメータを宣言しているものです。
こういった書き方もできます。
この場合、パスパラメータでの文字列はクエリパラメータからではなく、引数として関数に渡されることになります。
リクエストボディからの入力
HTTP
のPOST
メソッドを使うため、リクエストボディから引数を受け取ることとします。
まずは、下記のとおり、リクエストボディからの値を受けるためのSchema
を設定します。
from ninja import Schema
class HelloSchema(Schema):
name: str = "world"
これは、HelloSchema
というスキーマを定義し、その中でname
という引数を持たせ、str
型を指定しています。
これにより、基本的にname
はstr
型で値を受けることになります。
次に、このSchema
をapi_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
」のAPIから「Try it out」により文字列を変えて、「EXECUTE」すると、毎回文字列が変わることが確認できると思います。
このように、リクエストボディから値を受け取り、動的に返すことができます。
最後に
今回はここまでです。
簡単な設定で、Djangoの中でWebAPIが作れました。
また、OpenAPIを用いた見やすいdocsも用意されており、フロントエンドエンジニアとの同時並行の開発もできそうなUIが提供されています。
今回は初歩的な設定を簡単に行いました。
次回は、レスポンスの処理等についてやっていく予定です。
次回も読んでいただければと思います。