Django REST Framework(十九)权限

news/2024/9/19 0:41:27/ 标签: django, python, 后端

Django REST framework (DRF) 的权限认证涉及以下几个方面:全局权限配置、局部权限配置、自定义权限类、以及自定义认证类。以下是关于这些方面的详细说明:

1. 全局权限配置

在 Django 项目的配置文件 settings.py 中,可以全局配置 DRF 的权限管理类。这种设置适用于整个项目中的所有视图。默认情况下,如果不做任何配置,DRF 会允许所有用户访问视图(AllowAny)。

python"># settings.py
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',  # 仅允许已通过身份认证的用户访问)
}

在此配置下,所有视图都会默认要求用户通过身份认证,否则无法访问。

2. 局部权限配置

局部权限配置可以覆盖全局设置,适用于单独的视图或视图集。通过为视图类指定 permission_classes 属性,可以定义该视图的权限控制。

python">from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIViewclass ExampleView(APIView):permission_classes = [IsAuthenticated]  # 仅允许已认证用户访问该视图...

局部配置让你可以在不同视图中应用不同的权限策略,提供了更灵活的控制。

3. 自定义权限类

有时内置的权限类不能满足所有需求,此时可以通过继承 rest_framework.permissions.BasePermission 类来创建自定义权限类。在这个类中,需要实现以下两个方法之一或全部:

  • .has_permission(self, request, view):判断用户是否有权访问视图。
  • .has_object_permission(self, request, view, obj):判断用户是否有权对特定模型对象执行操作。

例如,定义一个只允许角色为“xiaoming”的用户访问视图的权限类:

python">from rest_framework.permissions import BasePermissionclass IsXiaoMingPermission(BasePermission):"""仅允许角色为 'xiaoming' 的用户访问的自定义权限类"""def has_permission(self, request, view):role = request.query_params.get("role")return role == "xiaoming"def has_object_permission(self, request, view, obj):# 这里可以加入对模型对象的权限控制逻辑return True

在视图中使用这个自定义权限类:

python">from .permissions import IsXiaoMingPermission
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializerclass StudentViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentSerializerpermission_classes = [IsXiaoMingPermission]  # 应用自定义权限类

4. 自定义认证类

自定义认证类用于扩展或替代 DRF 提供的默认认证机制(如 Session 认证、Basic 认证等)。自定义认证类需要继承 rest_framework.authentication.BaseAuthentication 并实现 authenticate(self, request) 方法。

python">from rest_framework.authentication import BaseAuthentication
from django.contrib.auth.models import Userclass CustomAuthentication(BaseAuthentication):"""自定义认证类,根据请求参数中的角色进行认证"""def authenticate(self, request):role = request.query_params.get("role")if role == "root":user = User.objects.get(pk=1)  # 假设用户 ID 为 1 的是超级管理员return (user, None)return None

在视图中使用自定义认证类:

python">from .authentications import CustomAuthentication
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializerclass Student1ModelViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentSerializerauthentication_classes = [CustomAuthentication]  # 使用自定义认证类permission_classes = [IsAuthenticated]  # 使用内置权限类

5. 总结

通过全局配置、局部配置、自定义权限类和自定义认证类,可以实现复杂的权限和认证逻辑,满足项目中不同的安全需求。这种灵活性使得 Django REST framework 成为处理复杂 API 需求的强大工具。


http://www.ppmy.cn/news/1519164.html

相关文章

B+树的原理及实现

B树的原理及实现 一、引言 B树是一种基于B树的树形数据结构,它在数据库和文件系统的索引中有着广泛的应用。与B树相比,B树的所有数据记录都存储在叶节点上,并且增加了顺序访问的能力,这使得B树在处理大量数据时更加高效。 二、…

Python 爬虫爬取京东商品信息

Python 爬虫爬取京东商品信息 下面我将逐一解释每一部分的代码 导入库 from selenium import webdriver from selenium.webdriver.edge.service import Service from selenium.webdriver.edge.options import Options import time import random import csv from selenium.co…

学习大数据DAY43 Sqoop 安装,配置环境和使用

目录 sqoop 安装 配置 mysql sqoop 安装 sqoop 指令集 sqoop 使用 sqoop 创建 hive 表 sqoop 全量导入表 sqoop 增量导入表 sqoop 全量导出表 sqoop 分区表导入表 sqoop 分区表导出表 上机练习 sqoop 安装 配置 mysql create database test DEFAULT CHARACTER S…

农产品智慧物流系统论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#x…

python 实现一个简单的网页爬虫程序

最近在学习python,以下为网页爬虫代码,供参考 1、爬取指定网页的标题和所有的连接 2、并将这些信息保存到一个文件中。 前置:因使用到网页相关的功能,故需导入requests、BeautifulSoup 库来完成 #导入网页相关的库 import requ…

干货分享|分享一款高效的软件卸载神器 Geek Uninstaller

问题:卸载软件时,时常会留下残留文件和注册表。当遇到流氓软件,还常常卸载失败。 1.软件介绍 特点:高效快速,小巧便携。100% 免费 2.下载方法 官方下载网站:Geek Uninstaller - the best FREE uninstaller …

中锂天源锂电池:为卡车驻车空调提供高效、安全、持久的能源解决方案

随着我国运输行业的飞速发展,卡车司机对驾驶环境和行车舒适度的要求越来越高。在炎炎夏日或寒冷冬季,驻车空调已成为卡车司机的必需品。然而,传统驻车空调供电方式存在诸多问题,如电力不足、续航时间短等。为解决这一痛点&#xf…

Unet改进17:添加ShuffleAttention||减少冗余计算和同时存储访问

本文内容:在不同位置添加ShuffleAttention注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 注意机制使神经网络能够准确地关注输入的所有相关元素,已成为提高深度神经网络性能的重要组成部分。在计算机视觉研究中广泛应用的注意机制主要有空间注…

ElasticSearch7.12.1详细安装

部署ElasticSearch docker安装 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络 创建网络 docker network create es-net 查看网络列表 docker network ls 获取镜像包 docker pull elasticsearch:7.12.1 运行 docker run -d \ -…

【扩散模型(七)】IP-Adapter 与 IP-Adapter Plus 的具体区别是什么?

系列文章目录 【扩散模型(二)】IP-Adapter 从条件分支的视角,快速理解相关的可控生成研究【扩散模型(三)】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分,即 img projection…

EXO:模型最终验证的地方;infer_tensor;step;MLXDynamicShardInferenceEngine

目录 EXO:模型最终验证的地方 EXO:infer_tensor EXO:step MXNet的 mx.array 类型是什么 NDArray优化了什么 1. 异步计算和内存优化 2. 高效的数学和线性代数运算 3. 稀疏数据支持 4. 自动化求导 举例说明 EXO:模型最终验证的地方 EXO:infer_tensor 这段代码定…

MariaDB 和 MySQL 版本关联

MariaDB 和 MySQL 是两个常用的关系型数据库管理系统(RDBMS),它们在很多方面非常相似,因为 MariaDB 是 MySQL 的一个分支。MariaDB 和 MySQL 之间的版本关联可以通过以下几个方面来理解: 1. 历史背景 MySQL: MySQL 是…

数学建模强化宝典(1)级比检验

前言 级比检验是灰色预测中一个重要的步骤,主要用于判断原始数据是否满足准指数规律,从而确定数据是否适合进行灰色预测分析。 一、级比检验的定义 级比检验是通过计算原始数据与其前一期数据的比值(即级比),并对级比进…

智普大模型API调用

接口 用python调用智普免费API接口的例子,写成函数, 类似于 def get_answer(prompt):url = http://34.132.32.68:8081/v1/chat/completionsheaders = {Content-Type: application/json,}data = {"model": "Qwen2-72B-int4","messages": [{&q…

强化学习——马尔可夫决策过程的理解

目录 一、马尔可夫决策过程1.策略2.状态价值函数3.动作价值函数4.贝尔曼期望方程 参考文献 一、马尔可夫决策过程 马尔可夫决策过程(MDP)是马尔可夫奖励过程(MRP)的扩展,它引入了“动作”这一外界的影响因素&#xff0…

vscode怎么改成黑色主题?

在Visual Studio Code(简称VS Code)中,将界面调整为黑色主题是一个简单的过程,可以通过几个步骤轻松完成。以下是详细的操作指南,涵盖了从基本设置到高级自定义化的不同方法。 通过用户设置更改主题 打开设置&#xf…

C# 去掉字符串最后一个字符的5种方法

C# 去掉字符串最后一个字符的 5 种方法 (1)Substring string original "Hello!"; string result original.Substring(0, original.Length - 1); Console.WriteLine(result); // 输出: Hello (2)Remove string o…

prometheus安装篇

一、安装 1、下载二进制安装包 https://github.com/prometheus/prometheus/releases/download/v2.25.0/prometheus-2.25.0.linux-amd64.tar.gz 2、解压 rootxxx:~# cd /data rootxxx:~# tar -xf prometheus-2.25.0.linux-amd64.tar.gz rootxxx:~# mv prometheus-2.25.0.li…

比较一下React与Vue

React和Vue都是现代前端开发中广泛使用的JavaScript库,它们各自具有独特的特点和优势。以下是对React和Vue的比较: 1. 开发模式和范式 React: 本质是一个前端组件框架,由后端组件演化而来。 鼓励将UI分解为小的、独立的、可复用…

零基础学习人工智能—Python—Pytorch学习(九)

前言 本文主要介绍卷积神经网络的使用的下半部分。 另外,上篇文章增加了一点代码注释,主要是解释(w-f2p)/s1这个公式的使用。 所以,要是这篇文章的代码看不太懂,可以翻一下上篇文章。 代码实现 之前,我们已经学习了概念…