当前位置: 首页 > news >正文

django permission_classes = [AllowAny] 如何限制到具体接口

在 Django REST framework (DRF) 中,permission_classes 用于定义哪些用户可以访问给定的视图。当你使用 AllowAny 作为权限类时,这表示任何用户都可以访问该视图,无论他们是否通过认证。如果你想限制访问到具体的接口,但又不想让任何用户都能访问,你可以使用其他权限类,例如 IsAuthenticated 或自定义权限类。

使用 IsAuthenticated
如果你希望只有已认证的用户才能访问某个接口,你可以将权限类设置为 IsAuthenticated。

from rest_framework.permissions import IsAuthenticated

class MyView(APIView):
permission_classes = [IsAuthenticated]

def get(self, request, *args, **kwargs):# 只有已认证的用户可以访问这个GET请求pass

自定义权限类
如果你需要更细粒度的控制,比如基于用户的角色或特定条件来限制访问,你可以创建一个自定义的权限类。

from rest_framework.permissions import BasePermission

class IsAdminOrReadOnly(BasePermission):
def has_permission(self, request, view):
if request.method in permissions.SAFE_METHODS:
return True
return request.user.is_staff

class MyView(APIView):
permission_classes = [IsAdminOrReadOnly]

def get(self, request, *args, **kwargs):# 任何用户都可以GET请求,但只有管理员可以POST、PUT、DELETE等请求pass

结合使用多个权限类
你也可以结合使用多个权限类,例如允许所有用户GET请求,但只有管理员可以POST请求。

from rest_framework.permissions import IsAuthenticated, AllowAny, IsAdminUser
from rest_framework import permissions

class MyView(APIView):
permission_classes = [AllowAny] # 允许所有用户GET请求

def get(self, request, *args, **kwargs):# 任何用户都可以GET请求passdef post(self, request, *args, **kwargs):# 只有管理员可以POST请求return self.permission_denied(request, message="仅管理员可以POST", code=403)

注意,在上面的代码中,我们实际上没有在 permission_classes 中直接设置 IsAdminUser 来限制POST方法,而是在POST方法内部手动返回权限拒绝。这是因为DRF不直接支持在单个视图中对不同HTTP方法应用不同的权限类。为了实现这一功能,你可以在方法内部进行权限检查,或者使用更高级的视图或路由配置方法(如方法装饰器)。例如:

from rest_framework.decorators import permission_classes
from rest_framework.permissions import IsAdminUser

class MyView(APIView):
permission_classes = [AllowAny] # 允许所有用户GET请求

@permission_classes([IsAdminUser])
def post(self, request, *args, **kwargs):# 只有管理员可以POST请求pass

这种方法使用了DRF的装饰器来为特定方法指定权限类。这样可以更灵活地控制不同HTTP方法的访问权限。

http://www.dtcms.com/a/317267.html

相关文章:

  • 得物向量数据库落地实践
  • 智慧二次供水管理系统解决方案:城市供水“最后一公里”
  • 【面试场景题】电商秒杀系统的库存管理设计实战
  • Docker swarm 常用的命令集合
  • 线轨矫平机:让“钢轨”变直的幕后物理课
  • 移动端网页调试实战,跨设备兼容与触控交互问题排查全流程
  • SassSCSS:让CSS拥有超能力的预处理器
  • `<dependencyManagement>`内部的`<dependencies>`和外部的`<dependencies>`的区别:
  • Spring Boot全局异常处理与日志监控实战指南
  • 浙江大学PTA程序设计C语言基础编程练习题6-10
  • Python爬虫实战:研究Photon工具,构建企业信息收集系统
  • 【Java】HashMap的key可以为null吗?如何存储的?
  • 线性代数中矩阵的基本运算运算
  • 【图像处理基石】浅谈3D城市生成中的数据融合技术
  • 分布式微服务--GateWay(1)
  • 【注意】HCIE-Datacom华为数通考试,第四季度将变题!
  • 基于Hadoop的木鸟民宿数据分析与可视化、民宿价格预测模型系统的设计与实现
  • OpenKruise
  • Linux《进程间通信(上)》
  • Git 乱码文件处理全流程指南
  • 记一次ORACLE ORA-00600 [19004] 错误的分析与解决方法
  • HarmonyOS 5 入门系列-鸿蒙HarmonyOS示例项目讲解
  • 铁路通信信号基础知识点(2)轨旁与车载ATP关系
  • 《动手学深度学习》读书笔记—9.5机器翻译与数据集
  • 虚拟机磁盘扩容
  • centos KVM
  • Java技术栈/面试题合集(19)-架构设计篇
  • Vue2中实现数据复制到 Excel
  • 【普通地质学】地球的物质组成
  • 什么是OAuth2.0协议?有哪几种认证方式?什么是JWT令牌?和普通令牌有什么区别?