Django-Rest-Framework 权限管理源码浅析(小结)

下面是 “Django-Rest-Framework 权限管理源码浅析(小结)”的完整攻略:

标题

简介

在 Restful API 开发过程中,权限管理是一个非常重要的问题。Django Rest Framework 提供了很多的权限组件,方便我们实现不同的权限管理。本文通过对 Django-Rest-Framework 权限管理源码的浅析,来讲解如何使用它完成自定义的权限管理。

权限组件的使用

Django Rest Framework已经为我们提供了以下的一些异常处理类:

  • APIException: DRF框架下所有其他异常类的父类
  • ValidationError: 验证错误,即对数据的验证不正确
  • PermissionDenied: 权限拒绝
  • NotFound: 页面未找到
  • MethodNotAllowed: 访问资源没有使用正确的请求方式
  • NotAuthenticated: 用户未认证

其中 PermissionDenied, NotAuthenticated 两个异常类就是用来处理权限相关的问题,我们可以根据实际的业务需求自定义异常类。

权限组件的使用非常简单,只需要对视图进行配置即可:

from rest_framework import permissions

class MyView(APIView):
    permission_classes = [permissions.AllowAny] # 所有人均可访问

还支持多种内置的权限类,例如 DjangoModelPermissions、DjangoObjectPermissions 等,用来管理模型或对象的权限。

权限源码浅析

在DRF中,权限相关源码位于 rest_framework.permissions 模块下。常用的权限类有:

  • AllowAny
  • IsAuthenticated
  • IsAdminUser
  • IsAuthenticatedOrReadOnly
  • DjangoModelPermissions
  • DjangoObjectPermissions

我们以 IsAuthenticated 权限类为例,简单介绍其源码:

class IsAuthenticated(BasePermission):
    """
    Allows access only to authenticated users.
    """
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

IsAuthenticated 注释已经帮我们解释了它的作用: 只允许已认证的用户访问。has_permission 是这个类中最重要的方法,它是基于定义的规则(这里是用户是否已通过身份验证)返回 True 或 False。如果这个方法返回 True,DRF 将允许用户进入视图,否则将引发 PermissionDenied 异常。

Permission 方法的简介

Permission 基类有以下方法:

  • has_permission():视图类级别的检查。
  • has_object_permission():对象级别的检查。

其中 has_permission() 是用来检查整个视图能否被访问,如果这个方法返回 True,那么视图可以被访问;如果返回 False,将会抛出 PermissionDenied 异常。

has_object_permission 是用来检查对象级别的权限。当视图操作对象时,DRF 将会调用这个方法,检查是否允许进行这个操作。如果你在你的视图中使用了这个类,你需要定义 get_object() 方法,以确保对象被正确加载。如果 has_object_permission() 返回 False,DRF 将会抛出 PermissionDenied 异常。

示例说明

以下示例用于 Reddit 网站,当用户试图编辑或删除某个评论时,执行 object 检查:

from rest_framework import permissions

class IsOwner(permissions.BasePermission):
    """
    来自对象已认证的请求只允许所有者访问。
    """

    def has_object_permission(self, request, view, obj):
        """
        确定请求的方法是否允许该对象的访问。
        """

        # Permissions放行请求GET,HEAD或OPTIONS
        if request.method in permissions.SAFE_METHODS:
            return True

        # 仅允许所有者进行写权限
        return obj.owner == request.user

这里我们定义了一个名为 IsOwner 的权限类,它是继承了 BasePermission。DRF 知道在检查对象权限时它需要调用 has_object_permission() 方法,因为它在 IsOwner 中已经被定义。我们重写了 has_object_permission 方法来执行对象的检查,根据是否为 GET 请求来分别判断允许访问或者是只允许所有者访问。

另外一个示例是用于 Reddit 网站,当用户没有通过身份验证时执行判断:

from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsNotAuthenticated(BasePermission):
    """
    仅允许未经身份验证的用户访问
    """
    def has_permission(self, request, view):
        # 允许不验证的请求GET,HEAD或OPTIONS
        if request.method in SAFE_METHODS:
            return True

        # 检查该请求是否是否验证过
        return not request.user.is_authenticated

我们可以开始看看has_permission() 方法。它检查 HTTP 请求方法是否是安全的 (SAFE_METHODS),如果是安全的方法(例如 GET)并且用户没有通过身份验证,则返回 True;

不是安全方法 (例如 POST、PUT 或 DELETE) 且用户不能通过身份验证,则返回 True。如果这个方法返回 False,DRF 将会抛出 PermissionDenied 异常。

小结

Django-Rest-Framework 权限管理源码浅析完整攻略已经结束。相信通过阅读本文,你已经对DRF的权限管理组件有了更深入的了解并可以自定义管理权限组件。同时,自定义的许可证组件应该由 BasePermission 类或其子类派生,该类包含 has_permissionhas_object_permission 条件的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django-Rest-Framework 权限管理源码浅析(小结) - Python技术站

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

相关文章

  • 浅谈keras中Dropout在预测过程中是否仍要起作用

    浅谈keras中Dropout在预测过程中是否仍要起作用 Dropout介绍 在深度学习中,为了防止模型出现过拟合现象,我们通常会采用Dropout技术,其本质是“随机失去神经元连接”,即在训练过程中以一定的概率随机使一些神经元失效,这可以强制让每个神经元都不能太依赖其它神经元。 注意:Dropout只在模型训练时才会被应用,而在预测时,则不需要再进行随机失…

    人工智能概论 2023年5月24日
    00
  • C++利用opencv实现人脸检测

    下面详细讲解一下C++利用OpenCV实现人脸检测的完整攻略。 确定使用的OpenCV版本 首先,需要确认使用的OpenCV版本。当前最新版本为4.5.1,可以从官网下载并安装。也可以通过包管理器等方式安装,如: sudo apt-get install libopencv-dev 创建C++工程 接着,需要创建一个C++工程。可以使用任何C++开发工具来创…

    人工智能概览 2023年5月25日
    00
  • Pytorch之保存读取模型实例

    PyTorch 是一种开源机器学习框架,它可以用于Python语言编写深度神经网络,并提供了一系列工具,方便我们训练和运行模型。在深度学习应用中,保存和读取训练好的模型是非常必要的,因为如果我们重新训练模型,则会费时费力,并且具有不确定性。因此,PyTorch 提供了对模型进行保存和读取的功能。本文将介绍如何在PyTorch中保存和读取模型实例。 保存模型 …

    人工智能概论 2023年5月25日
    00
  • 编写自定义的Django模板加载器的简单示例

    编写自定义的Django模板加载器可以让我们更加灵活地管理和渲染模板,本文将介绍如何编写自定义的Django模板加载器的完整攻略。 步骤一:创建自定义加载器 首先,我们需要创建一个自定义的Django模板加载器。通常情况下,我们可以通过继承django.template.loader.BaseLoader类来实现。 from django.template …

    人工智能概论 2023年5月24日
    00
  • Docker安装Nginx教程实现图例讲解

    Docker安装Nginx教程 简介 Docker 是一个轻量级容器引擎,通过 Docker 可以快速的部署和管理应用程序。同时,Nginx 是一款高性能的开源 Web 服务器,也可以作为反向代理服务器、负载均衡器等使用。本教程旨在讲解如何使用 Docker 安装 Nginx,以便更好地管理 Web 应用并提升性能。 准备工作 在开始安装之前,需要确保系统中…

    人工智能概览 2023年5月25日
    00
  • Django执行源生mysql语句实现过程解析

    好的。下面我会详细讲解“Django执行源生MySQL语句实现过程解析”的攻略。 1. 背景 在编写Django应用程序时,使用ORM来执行数据库操作是比较常见的做法。不过在某些特殊情况下,可能需要执行源生MySQL语句。 2. Django中执行MySQL语句的方法 在Django中执行MySQL语句有两种方法:使用django.db.connection…

    人工智能概论 2023年5月25日
    00
  • 详解Django框架中用context来解析模板的方法

    确实,Django使用context对象来渲染模板,其中包含了变量名称及其值。模板渲染可以通过使用模板引擎完成,同时可以使用模板标记包括逻辑控制语句的组合。这就是Django框架用于组织Web应用程序的基本方法之一。下面就详细讲解Django框架中用context来解析模板的方法。 定义context context就像一个字典,它是所有变量及其相应值的容器…

    人工智能概论 2023年5月25日
    00
  • 在OpenCV里使用特征匹配和单映射变换的代码详解

    要实现在OpenCV中使用特征匹配和单映射变换的代码,可以按照以下流程进行: 导入图像并调整大小 可以使用OpenCV中的cv2.imread()方法导入图片,其中第二个参数表示读取图片的颜色格式,通常使用cv2.IMREAD_COLOR或cv2.IMREAD_GRAYSCALE。读入后,可以使用cv2.resize()调整大小。 示例代码: import …

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部