Returning URLs
使REST架构有别于其他架构的最核心特征便是它强调组件间具有统一的接口。
— Roy Fielding, Architectural Styles and the Design of Network-based Software Architectures
让你的Web APIs返回绝对URIs是一个更好的实践,比如http://example.com/foobar
, 比 /foobar
更好。
这样做的优势在于:
-
更明确
-
减轻API客户端压力
-
当返回JSON这种非原生URIs类型时,不会导致字符串产生歧义。
- 更易于来用超链接标记 HTML。
- REST framework 提供了两个方法来给API返回绝对URIs。你可以不必使用它们,但是使用它们可以更方便的构建API。
reverse
Signature: reverse(viewname, *args, **kwargs)
和 django.core.urlresolvers.reverse
的行为类似,不同之处在于它会返回一个全限定URL,并且根据请求来决定host和port。
使用该方法时应该传入request及关键字参数,如:
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
Signature: reverse_lazy(viewname, *args, **kwargs)
和 django.core.urlresolvers.reverse_lazy
行为类似,不同之处在于它会返回一个全限定URL,并且根据请求来决定host和port。
同 reverse
方法一样要传入request做为关键字参数:
api_root = reverse_lazy('api-root', request=request)