返回

用Rest-framework搭建Django Restful API七:Router快速入门

闲谈

Rest-framework作为一个Python Web框架,帮助开发者快速、简单地创建RESTful API。它提供了许多特性和工具来简化API开发流程,其中之一就是路由。

1. 路由概述

路由是指将HTTP请求映射到适当的视图函数或类。在Rest-framework中,路由被分为两类:

  • 默认路由: 根据视图集的queryset属性自动生成路由。
  • 自定义路由: 允许开发者定义自己的路由规则,以实现更细粒度的控制。

2. 使用默认路由

默认路由是Rest-framework提供的最简单、最常用的路由方式。它根据视图集的queryset属性自动生成路由。例如,考虑以下视图集:

class ArticleViewSet(viewsets.ModelViewSet):
    queryset = Article.objects.all()

对于这个视图集,Rest-framework将自动生成以下路由:

  • /articles/:用于获取所有文章列表或创建新文章。
  • /articles/<pk>/:用于获取、更新或删除单个文章。

默认路由非常方便,但有时可能需要更细粒度的控制。例如,可能需要自定义路由以指定不同的URL模式或用户访问权限。

3. 使用自定义路由

自定义路由允许开发者定义自己的路由规则。可以使用routers.DefaultRouterrouters.SimpleRouter来创建自定义路由。

以下示例演示如何使用routers.DefaultRouter创建自定义路由:

router = routers.DefaultRouter()
router.register(r'articles', ArticleViewSet)

这将生成与默认路由相同的路由,但也可以使用router.register()方法来指定不同的URL模式或用户访问权限。例如:

router = routers.DefaultRouter()
router.register(r'articles', ArticleViewSet, basename='article')

这将生成以下路由:

  • /articles/:用于获取所有文章列表或创建新文章。
  • /articles/<article-id>/:用于获取、更新或删除单个文章。

也可以使用router.register()方法来指定用户访问权限。例如:

router = routers.DefaultRouter()
router.register(r'articles', ArticleViewSet, permission_classes=[IsAuthenticated])

这将要求用户在访问文章资源之前进行身份验证。

4. 返回所有列表视图的超链接

Rest-framework还提供了一种方法来返回所有列表视图的超链接。这可以使用HyperlinkedModelSerializer类来实现。例如:

class ArticleSerializer(HyperlinkedModelSerializer):
    class Meta:
        model = Article
        fields = ('id', 'title', 'content')

然后可以使用GenericAPIView类来创建列表视图:

class ArticleList(GenericAPIView):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer

    def get(self, request, format=None):
        return Response(self.get_queryset(), status=status.HTTP_200_OK)

这将生成一个列表视图,它将返回所有文章的超链接。

5. 模板化映射每个视图集的URL模式

Rest-framework还提供了一种方法来模板化映射每个视图集的URL模式。这可以使用format_suffix_patterns()函数来实现。例如:

urlpatterns = [
    path('api/', include(router.urls, format_suffix_patterns=[
        ('', {'format': '.json'}),
        ('html', {'format': '.html'}),
    ])),
]

这将生成以下URL模式:

  • /api/articles/:用于获取所有文章列表或创建新文章。
  • /api/articles/<article-id>/:用于获取、更新或删除单个文章。
  • /api/articles.json/:用于获取所有文章列表(JSON格式)。
  • /api/articles/<article-id>.json/:用于获取单个文章(JSON格式)。
  • /api/articles.html/:用于获取所有文章列表(HTML格式)。
  • /api/articles/<article-id>.html/:用于获取单个文章(HTML格式)。

6. 总结

Rest-framework中的路由提供了许多特性和工具来简化API开发流程。开发者可以使用默认路由或自定义路由来定义API的URL模式。Rest-framework还提供了一种方法来返回所有列表视图的超链接,以及一种方法来模板化映射每个视图集的URL模式。这些特性和工具使Rest-framework成为开发Django Restful API的理想选择。