概述

REST 架构风格与其他基于网络的风格的一个主要区别在于它对组件之间统一接口的强调。

—— Roy Fielding,《网络基础软件架构的架构风格与设计》

通常来说,在 Web API 中返回绝对 URI(如 http://example.com/foobar)可能是一种更好的实践,而不是返回相对 URI(如 /foobar)。

这样做的优点包括:

  • 更加明确。
  • 减少 API 客户端的工作量。
  • 在像 JSON 这样没有原生 URI 类型的表示形式中,字符串的含义没有歧义。
  • 便于在 HTML 表示形式中添加超链接。

Django REST framework 提供了两个实用函数,使 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)

观复
16 声望1 粉丝

君子慎独,不欺暗室,卑以自牧,含章可贞