reverse.py

URLを返す

RESTアーキテクチャスタイルを他のネットワークベースのスタイルと区別する中心的な特徴は、コンポーネント間の均一なインターフェースを重視していることです。

— Roy Fielding, アーキテクチャスタイルとネットワークベースのソフトウェアアーキテクチャの設計

原則として、Web APIからは、/foobarのような相対URIを返すよりも、http://example.com/foobarのような絶対URIを返す方が良いでしょう。

そうすることの利点は以下のとおりです。

  • より明示的である。
  • APIクライアントの作業が少なくて済む。
  • ネイティブURI型を持たないJSONのような表現で見つかった場合、文字列の意味についてあいまいさがない。
  • ハイパーリンクを使用してHTML表現をマークアップするのが簡単になる。

REST frameworkには、Web APIから絶対URIを返すのを簡単にするための2つのユーティリティ関数が用意されています。

これらを使用する必要はありませんが、使用する場合は、自己記述APIが自動的にその出力をハイパーリンクできるようになり、APIの閲覧がはるかに簡単になります。

reverse

シグネチャ: reverse(viewname, *args, **kwargs)

django.urls.reverseと同じ動作をしますが、ホストとポートを決定するためにリクエストを使用して、完全修飾URLを返します。

関数には、以下のように、リクエストをキーワード引数として含める必要があります。

from rest_framework.reverse import reverse
from rest_framework.views import APIView
from django.utils.timezone import now

class APIRootView(APIView):
    def get(self, request):
        year = now().year
        data = {
            ...
            'year-summary-url': reverse('year-summary', args=[year], request=request)
        }
        return Response(data)

reverse_lazy

シグネチャ: reverse_lazy(viewname, *args, **kwargs)

django.urls.reverse_lazyと同じ動作をしますが、ホストとポートを決定するためにリクエストを使用して、完全修飾URLを返します。

reverse関数と同様に、関数には、以下のように、リクエストをキーワード引数として含める必要があります。

api_root = reverse_lazy('api-root', request=request)