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

yizhihongxing

下面是 “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日

相关文章

  • CentOS 6.5如何安装跨平台计算机视觉库OpenCV

    以下是CentOS 6.5安装跨平台计算机视觉库OpenCV的完整攻略: 1. 安装依赖项 在安装OpenCV之前,需要安装一些依赖项。打开终端并输入以下命令: sudo yum install cmake gcc-c++ gtk2-devel libpng-devel libjpeg-devel libtiff-devel jasper-devel ope…

    人工智能概览 2023年5月25日
    00
  • pycharm远程连接服务器并配置python interpreter的方法

    接下来我将为你详细讲解“pycharm远程连接服务器并配置python interpreter的方法”的完整攻略。 1. 准备 在进行远程连接之前,确保已经完成如下准备工作: 确保你已经拥有远程服务器的IP地址和登录用户的用户名以及密码。 确保你已经安装了PyCharm软件,并且具备基本的Python编程开发知识。 2. 配置远程服务器 在完成准备工作后,需…

    人工智能概览 2023年5月25日
    00
  • JavaCV实现读取视频信息及自动截取封面图详解

    JavaCV实现读取视频信息及自动截取封面图详解 JavaCV是Java和OpenCV的一套接口,可以轻松地在Java环境下使用OpenCV库。本文将介绍如何使用JavaCV读取视频信息以及如何自动截取封面图。 基本环境 Java 8或以上版本 Maven JavaCV 读取视频信息 通过JavaCV可以实现读取视频信息,包括视频的宽度、高度、帧率以及时长等…

    人工智能概览 2023年5月25日
    00
  • 浅析Flask如何使用日志功能

    下面是详细讲解“浅析Flask如何使用日志功能”的完整攻略。 什么是日志 日志(Log)就是指在软件运行过程中,系统自动产生的记录系统活动的文件。它能记录所有软件运行期间产生的有关信息,如系统异常信息、错误信息、警告信息等等。通过查看日志文件,能够帮助软件开发人员快速找到软件存在的异常情况并对其进行修复。 Flask中的日志 Flask是一个轻量级Web应用…

    人工智能概论 2023年5月25日
    00
  • 如何在C#中使用OpenCV(GOCW使用教程)

    下面是“如何在C#中使用OpenCV(GOCW使用教程)”的完整攻略。 1. 简介 OpenCV是一个功能强大的计算机视觉库,可以在各种操作系统上使用C ++,Python和Java等多种语言。OpenCV的目的是提供一组易于使用的计算机视觉算法和工具库,旨在提高计算机视觉在现实世界中的应用。GOCW(Gifski OpenCV Wrapper)是一个用于连…

    人工智能概览 2023年5月25日
    00
  • django 实现电子支付功能的示例代码

    下面是 django 实现电子支付功能的示例代码的完整攻略: 1. 安装相关库 在 django 项目中实现电子支付功能,首先需要使用到相应的库。目前比较流行的有以下两个: django-payments:这是一个基于 Django 的支付应用,集成了多个第三方支付服务提供商的 SDK,可通过该应用快速实现主流的电子支付功能。 stripe:这是一家美国电子…

    人工智能概论 2023年5月24日
    00
  • DJANGO-ALLAUTH社交用户系统的安装配置

    下面是“DJANGO-ALLAUTH社交用户系统的安装配置”的完整攻略: 1. 安装 首先需要在终端中使用pip安装django-allauth: pip install django-allauth 安装完成后需要在项目的settings.py文件中添加以下内容: INSTALLED_APPS = [ # … ‘django.contrib.sites…

    人工智能概览 2023年5月25日
    00
  • Python3.7中安装openCV库的方法

    Python3.7中安装openCV库的方法可以分为三个步骤:安装依赖库、下载openCV源码、编译openCV源码并安装。具体攻略如下: 步骤一:安装依赖库 在安装openCV库之前,需要先安装以下依赖库: numpy matplotlib pillow scipy 可以使用以下命令安装: pip install numpy matplotlib pill…

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