MENU

Django Ninjaチュートリアル18(URLの逆引き)

Django Ninjaチュートリアル18(URLの逆引き)

前回までの記事はこちらです。

前回までの記事が読まれている前提で書いていきますので、まだ読んでいない方はこちらから読み進めて追いついてください。

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

目次

URLの逆引き

今回は公式ドキュメントからURLの逆引きについてみていきます。

URLの逆引き用の名前

URLの逆引き用の名前は、Django NinjaのSchema(もしくはRouter)のメソッド毎に生成されます。

URLの生成方法

それぞれのURLは名前スペース(デフォルトはapi-1.0.0)に含まれており、それぞれのURL名はデコレータが付与された関数(関数名)と一致します。
例を見てみます。

form ninja import NinjaAPI

api = NinjaAPI()

@api.get("/")
def index(request):
    ...

# URLの名前を取得し、変数に設定(reverse_lazyで遅れて取得)
index_url = reverse_lazy("api-1.0.0:index") # 名前スペース→api-1.0.0にあるindex関数

reverse_lazy とは?
ページ名からURLを取得するメソッドのこと。
クラスベースビュー内の変数に対して使用する。
変数の読み込みが先に行われるため、lazy(遅い、遅延のある)なメソッドを使用する。

このような暗黙的なURL名は、それぞれのAPIのパスの最初のオペレーションにのみ設定されます。
つまり、同じ関数を設定すると、2番目以降に設定されたAPIには適用されないということです。

この暗黙的な逆引きのURL名の設定をしたくない場合は、url_name=""(空の文字列)により明示的に指定します。

URL名を変更する

デフォルトのURL名を使用しない場合、メソッドデコレータのプロパティとして、明治的に指定することができます。
例をみていきます。

form ninja import NinjaAPI

api = NinjaAPI()

@api.get("/users", url_name="user_list") # url_nameにより任意のURL名を設定
def users(request):
    ...

# URLの名前を取得し、変数に設定
users_url = reverse_lazy("api-1.0.0:user_list") # メソッドで指定したURL名から逆引きできる

これによりAPIパスが暗黙的にオーバーライドされることになります。

デフォルトのURL名をオーバーライドする

また、get_operation_url_nameメソッドによりオーバーライドすることで、暗黙的なURL名はオーバーライドすることができます。

class MyAPI(NinjaAPI):
  def get_operation_url_name(self, operation, router):
    return operation.view_func.__name__ + '_my_extra_suffix'

api = MyAPI()

@api.get("/users)
  def users(request):
    ...

users_url = reverse_lazy("api-1.0.0:users_my_extra_suffix")

この例のような設定をすると、末尾に_my_extra_suffixを付けたURL名を設定する基本設定をすることができます。
つまり、この例の設定により先ほどのAPIを設定すると、reverse_lazyにより逆参照するURL名は、users_my_extra_suffixとなります。

名前スペースのカスタマイズ

デフォルトのURLの名前スペースは、スキーマのバージョンの先頭に"api-"を付けて設定されますが、NinjaAPIのスキーマクラスの引数であるurls_namespaceをオーバーライドすることで、明示的に名前スペースを特定することができます。

# 通常のapiインスタンスの生成
api = NinjaAPI(
  auth = token_auth,
  version = '2'
)

# 個別にURLの名前スペースを設定したインスタンスを生成
api_private = NinjaAPI(
  auth = session_auth,
  urls_namespace = 'private_api'
)

# デフォルトのapiインスタンスから設定したAPIの場合:api-で生成された関数から逆参照
api_users_url = reverse_lazy("api-2:users")

# private_apiインスタンスから設定したAPIの場合:private_apiで生成された関数から逆参照
private_api_admins_url = reverse_lazy("private_api:admins")

最後に

今回はDjango NinjaにおけるURLの逆引きの設定についてみてみました。
NInja Schemaから生成された時点で、自動のURLの名前スペースが割り振られ、デコレータが付与された関数名と一致することがわかりました。
また、逆引き用のURL名は任意で設定ができますので、URLの構成が複雑になった際に、その複雑なURLの参照名を設定しておくなどの使い方ができるのではないかと思いました。

基本的には引数のオーバーライドで可能であるため、そんなに難しくないように感じましたが、実際のアプリケーション開発で使ってみて、使い勝手を見てみます。

次回は、Djnago Ninjaにおける非同期処理の対応についてみていきます。

FastAPIでは基本的に非同期で実行される関数を設定しますが、Django Ninjaでこれまで学習してきた内容はあくまで通常のREST APIを生成するのみです。
Django Ninjaにおける非同期処理の手法についても、公式ドキュメントをとおして、学習していきたいと思います。

ぜひ次回も読んでいただけたらと思います。
今回は以上です。

Django Ninjaチュートリアル18(URLの逆引き)

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

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

この記事を書いた人

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

目次