Django REST framework 视图和路由详解

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技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 【Django后台数据管理】后台数据新建或者保存,经常遇到提示This field is required

        如下图:   2、设置blan属性为True   blan=True  

    Django 2023年4月13日
    00
  • django+uwsgi+daphne+supervisor生产环境部署

    一、前言   在上一篇文章中项目中使用了webscoket进行实时通讯,但是生产环境又使用了django+nginx+uwsgi的部署方式,我们都知道uwsgi并不能处理websocket请求,所以需要asgi服务器来处理websocket请求,官方推荐的asgi服务器是daphne,下面将介绍详细的部署步骤。   二、软件安装   之前已经写过一一篇关于d…

    Django 2023年4月16日
    00
  • Django自带表User认证详解

    认证登陆(附方法实现代码,百度网盘拉取即可下载,激活码:gqt1) 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中; 如果用户存在于数据库中,然后再验证用户输入的密码,这样一来就要自己编写大量的代码。 事实上,Django已经提供了内置的用户认证功能。 在使用”python manage.py make…

    2023年4月10日
    00
  • Django模板过滤器用法详解

    Django模板过滤器是在模板中使用的一种函数式方法。它用于将模板变量转换为所需形式的输出,例如大小写,日期格式,字符串截断等操作。 在这篇文章中,我们将详细介绍Django模板过滤器的使用方法,并提供一些示例代码,以便您更好地了解这个功能。 Django模板过滤器的使用 Django模板过滤器使用“|”(竖杠)进行连接。这表示取左边的变量,将其传递到右边的…

    Django 2023年3月12日
    00
  • Django日志系统

    在Django中使用的日志系统是基于Python中的loggin模块。 首先简单介绍下logging。 一 Loggin模块简介 loggin模块主要包含以下四个部分: Loggers           用户使用的直接接口,将日志传递给Handler Handlers          控制日志输出到哪里,console,file…    一个logger…

    Django 2023年4月12日
    00
  • Django rest framework 自定义Exception

      使用Dango rest framework时,有时需要raise APIException到前端,为了统一错误返回格式,我们需要对exception的格式进行调整。 方法: 1. 在project/utils目录下新建exceptions.py 内容:   1 from rest_framework.views import exception_han…

    Django 2023年4月16日
    00
  • django之集成第三方支付平台PaysAPI与百度云视频点播服务接入

    PaysAPI直接查看接口文档:https://www.paysapi.com/docindex,比较简单 百度云视频点播服务接入: 1. 准备工作:百度云的示例:http://cyberplayer.bcelive.com/demo/new/index.html      · 在百度云注册账号并且开通“音视频点播VOD”服务      · 进入后台管理系统…

    Django 2023年4月13日
    00
  • Django 框架篇(十): django自带的认证系统

    目录 auth模块 authenticate()    login(HttpRequest, user) logout(request)  is_authenticated() login_requierd() create_user() create_superuser() check_password(password) set_password(pas…

    Django 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部