Django REST framework(DRF)是一种基于 Django 的强大且灵活的工具,可帮助我们更轻松地为我们的 Django 应用程序创建 RESTful API。它提供了一组工具和库来帮助我们构建更有效的 Web API,并包括功能强大的序列化,认证,请求,响应和路由工具等功能。
DRF 包含了许多构建 Web API 所需的基本组件,但是我们需要学会如何将它们组合在一起使用。在使用 DRF 开发 Web API 时,其中两个最重要的概念是视图和路由,它们是 Web API 开发的基础。
视图
视图是 Django 中的一种模式,用于处理来自客户端的请求并返回响应。在 DRF 中,视图有一些额外的功能,例如身份验证(authentication)和数据序列化(serialization)。DRF 提供了多种视图类型,其中最常用的是基于类的视图。
基于类的视图
基于类的视图通过继承 DRF 中的通用视图来实现。通用视图提供了常见的视图行为,例如获取对象列表(list)、创建对象(create)、更新对象(update)、删除对象(delete)和获取单个对象(retrieve)等。我们可以根据自己的需求覆盖通用视图提供的方法,或者从中继承新的方法。
下面是一个 DRF 中的基本示例:
from rest_framework.views import APIView
from rest_framework.response import Response
class HelloView(APIView):
def get(self, request):
return Response("Hello, World!")
在上面的示例中,我们创建了一个名为 HelloView
的 APIView 视图。这个视图有一个 GET 方法,用来返回一个包含字符串 "Hello, World!" 的 Response 对象。
通用视图
在 DRF 中,我们还可以使用通用视图来实现相同的行为,但不需要为每个视图方法编写重复的代码。通用视图具有一些预定义的方法,用于执行各种操作,例如,获取对象列表(ListAPIView)或一个对象详情(RetrieveAPIView)等,可以使用这些预定义方法轻松地实现我们的视图。
下面是一个使用 ListAPIView 的示例代码:
from rest_framework.generics import ListAPIView
from someapp.serializers import SomeModelSerializer
from someapp.models import SomeModel
class SomeModelListView(ListAPIView):
queryset = SomeModel.objects.all()
serializer_class = SomeModelSerializer
permission_classes = [AllowAny]
在上面的示例中,我们创建了一个名为 SomeModelListView
的视图,并设置了相应的属性。queryset 属性指定了查询所有某个模型中的所有实例,而 serializer_class 属性指定了该模型的序列化器,序列化器用于将查询结果转化为 JSON 格式。permission_classes 属性指定了此视图的权限,如果不设置, 将使用全局默认权限(settings.DEFAULT_PERMISSION_CLASSES)。
路由
在 Django 中,路由是用于将 URL 映射到对应的视图的机制。在 DRF 中,我们使用路由来将 URL 映射到视图集,视图集类似于 Django 中的视图,但允许我们查询和操作数据。
DRF 中,使用以下类中的一个或多个来定义路由:
- SimpleRouter:用于定义基于视图集的标准路由;
- DefaultRouter:类似于 SimpleRouter,但是包括一个自动生成的根视图;
- APIRouter:DRF 3.10 版本中引入,类似于 SimpleRouter,但是在多个视图集中定义通用操作。
SimpleRouter
在 SimpleRouter 中,我们需要定义视图集并将其绑定到一个 URL。
下面是一个使用 SimpleRouter 的示例代码:
from rest_framework.routers import SimpleRouter
from someapp.views import SomeModelViewSet
router = SimpleRouter()
router.register(r'somemodels', SomeModelViewSet)
urlpatterns = router.urls
在上面的示例中,我们首先导入 SimpleRouter 并定义了一个 SomeModelViewSet 的视图集。使用 router.register()
方法将视图集绑定到 /somemodels/
路由上,并返回该路由的 URL 链接。
如果我们访问该 URL,将调用视图集的 list() 方法来返回一个包含所有 SomeModel 对象的 JSON 数组。
DefaultRouter
DefaultRouter 与 SimpleRouter 类似,但是包括一个自动生成的根视图。
下面是一个使用 DefaultRouter 的示例代码:
from rest_framework.routers import DefaultRouter
from someapp.views import SomeModelViewSet
router = DefaultRouter()
router.register(r'somemodels', SomeModelViewSet)
urlpatterns = router.urls
在上面的示例中,我们首先导入 DefaultRouter 并定义了一个 SomeModelViewSet 的视图集。与 SimpleRouter 相同,使用 router.register()
将视图集绑定到 /somemodels/
路由上,并返回该路由的 URL 链接。
如果我们访问该 URL,将调用视图集的 list() 方法并返回一个包含所有 SomeModel 对象的 JSON 数组。 但是,在访问 http://127.0.0.1:8000/
时,我们将看到一个默认的 HTML 页,其中包含所有可用 API 的链接。
APIRouter
APIRouter 是 DRF 3.10 版本中引入的一种新路由类型,类似于 SimpleRouter。与 SimpleRouter 相比,APIRouter 允许创建中央点以便将模型视图绑定到同一路由上。
下面是一个使用 APIRouter 的示例代码:
from rest_framework.routers import APIRouter
from someapp.views import SomeModelViewSet
router = APIRouter()
router.register(r'somemodels', SomeModelViewSet)
urlpatterns = router.urls
在上面的示例中,我们首先导入 APIRouter 并定义一个 SomeModelViewSet 的视图集。与 SimpleRouter 和 DefaultRouter 相同,使用 router.register()
方法将视图集绑定到 /somemodels/
路由上,并返回该路由的 URL 链接。
结论
在使用 DRF 构建 Web API 时,视图和路由是必不可少的组件。视图是客户端用来向 API 发送请求的组件,路由是用来将 URL 映射到方法的组件。掌握这两个组件并学会如何正确使用它们,可以让我们轻松构建高效,可扩展和易于维护的 Web API。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django REST framework 视图和路由详解 - Python技术站