Django REST framework 视图和路由详解

yizhihongxing

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 – 权限分配、权限组件与CRM整合

     一、权限分配   需求:为用户分配角色,为角色分配权限,如下图效果: 1、视图代码: from django.shortcuts import render from django.http import JsonResponse from rbac.models import User, Role, Permission def distribute_p…

    Django 2023年4月10日
    00
  • Django项目后台不挂断运行的方法

    下面是详细讲解“Django项目后台不挂断运行的方法”的攻略: 方法一:使用Supervisor Supervisor是一个用Python编写的进程管理工具。通过在系统中安装Supervisor,我们可以将Django项目的Web服务器后台运行并在系统崩溃或关闭时继续运行。 安装Supervisor 通过包管理器安装Supervisor,例如在Debian/…

    Django 2023年5月16日
    00
  • Django-5

    Django-5 Django-5 1.Coookie 1.1 什么是cookie Cookie是储存在浏览器端的一小段文本数据(键值对). 被广泛用于在网站之间传输信息, 当您访问一个网站时,它会将一个Cookie发送到您的浏览器中,并在您返回该网站时读取该Cookie。 1.2 如何在django中使用cookie 设置cookie rep = rend…

    Django 2023年4月10日
    00
  • django数据库批量创建

    import os import sys if __name__ == ‘__main__’: os.environ.setdefault(“DJANGO_SETTINGS_MODULE”, “test01.settings”) import django django.setup() from app01 import models # 批量创建 # 有1…

    Django 2023年4月11日
    00
  • Django中blank和NULL

    当我们在django中添加一个数据库字段时,我们通常会写models.CharField(max_length = 100,null = True,blank = True)。用ForeignKey,DecimalField做同样的事情。有什么基本的区别在于 null = True only blank = True only null = True,bla…

    Django 2023年4月11日
    00
  • 使用python搭建Django应用程序步骤及版本冲突问题解决

    来为您详细讲解“使用Python搭建Django应用程序步骤及版本冲突问题解决”的完整攻略。 步骤一:安装Python和pip 访问Python官网(https://www.python.org/downloads/),下载并安装最新版的Python。如果已安装,则可以跳过此步骤。 Python自带pip包管理工具,如果使用的Python版本低于2.7.9或…

    Django 2023年5月16日
    00
  • Django框架中视图的用法

    请看下面的完整攻略。 1. Django框架中视图的作用 在Django框架中,视图(View)是一个Python函数或方法,用于处理一个HTTP请求和返回一个HTTP响应。Django框架中的MVT(Model-View-Template)模式中,视图是控制器(Controller)的角色,用于将用户请求和模型交互,从而响应用户的请求。 通俗点理解,可以把…

    Django 2023年5月16日
    00
  • django 静态资源配置

    最近在学习一个项目,django框架,但当 render 模板时,模板里有引入的图片就访问不到, 这是因为 django部署方式比较特别,采用静态文件路径:STATICFILES_DIRS的部署方式,之前你写的相对路径,绝对路径因为缺少静态文件路径而全部失效 解决办法: 步骤1:在settings.py文件的最后加上以下内容: STATIC_URL = ‘/…

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