reverse.py

返回 URL

REST 架构风格区别于其他基于网络的风格的核心特征在于它强调组件之间的统一接口。

— Roy Fielding,架构风格和基于网络的软件架构的设计

通常情况下,最好从 Web API 返回绝对 URI,例如 http://example.com/foobar,而不是返回相对 URI,例如 /foobar

这样做的好处是

  • 它更明确。
  • 它为 API 客户端减少了工作量。
  • 在 JSON 等没有本机 URI 类型的表示中找到字符串时,它的含义没有歧义。
  • 它可以轻松地用超链接标记 HTML 表示等内容。

REST 框架提供了两个实用函数,可以更轻松地从 Web API 返回绝对 URI。

你没有必要使用它们,但如果你使用它们,则自描述 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)