首页 > 其他分享 >【DRF-05】rest-framework之权限

【DRF-05】rest-framework之权限

时间:2024-05-23 22:20:24浏览次数:18  
标签:permission models self 05 request rest framework 权限 permissions

  • 1.需求:订单信息必须是SVIP用户才能查看
  • 2.基本使用
    • 2.1:models.py
from django.db import models

class UserInfo(models.Model):
    user_type_choices = (
        (1,'普通用户'),
        (2,'VIP'),
        (3,'SVIP'),
    )
    user_type = models.IntegerField(choices=user_type_choices)
    username = models.CharField(max_length=32,unique=True)
    password = models.CharField(max_length=64)

class UserToken(models.Model):
    user = models.OneToOneField(to='UserInfo',on_delete=models.CASCADE)
    token = models.CharField(max_length=64)
  • 2.2:自定义权限类
from rest_framework.permissions import BasePermission

class SVIPPermission(BasePermission):
    message = "必须是SVIP才能访问"
    def has_permission(self,request,view):
        if request.user.user_type != 3:
            return False
        return True
  • 2.3:设置全局使用
REST_FRAMEWORK = {
    # 全局使用的认证类
    "DEFAULT_AUTHENTICATION_CLASSES":['app01.utils.auth.FirstAuthtication','app01.utils.auth.Authtication', ],
    # "DEFAULT_AUTHENTICATION_CLASSES":['app01.utils.auth.FirstAuthtication', ],
    # "UNAUTHENTICATED_USER":lambda :"匿名用户"
    "UNAUTHENTICATED_USER":None, # 匿名,request.user = None
    "UNAUTHENTICATED_TOKEN":None,# 匿名,request.auth = None
    "DEFAULT_PERMISSION_CLASSES":['app01.utils.permission.SVIPPermission',]    # 权限类路径
}
  • 2.4:如果不想全局使用,局部使用--只需要在对应的视图中加上permission_classes = [权限类,]即可

  • 2.5:实现效果

  • 3.权限源码流程

    • 3.1:请求进来-->执行dispatch方法-->initialize_request方法封装request-->initial方法,认证/权限/频率等,check_permissions方法
 def check_permissions(self, request):
    """
    Check if the request should be permitted.
    Raises an appropriate exception if the request is not permitted.
    """
    # 权限对象列表
    for permission in self.get_permissions():
        if not permission.has_permission(request, self):   # 如果没权限
            self.permission_denied(
                request,
                message=getattr(permission, 'message', None),
                code=getattr(permission, 'code', None)
            )
  • 3.2:执行get_permissions方法-->执行permission_classes,获取permission_classes对象,优先从视图自己,如果没有获取setting中的DEFAULT_PERMISSION_CLASSES字段
def get_permissions(self):
    """
    Instantiates and returns the list of permissions that this view requires.
    """
    return [permission() for permission in self.permission_classes]

class APIView(View):
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
    ...
  • 3.3:如果有权限对象(就循环执行自定义权限类的has_permission方法,如果返回True,有权限;如果返回False,没权限);如果没有,执行permission_denied抛出异常.
class BasePermission(metaclass=BasePermissionMetaclass):
    """
    A base class from which all permission classes should inherit.
    """

    def has_permission(self, request, view):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

    def has_object_permission(self, request, view, obj):
        """
        Return `True` if permission is granted, `False` otherwise.
        """
        return True

标签:permission,models,self,05,request,rest,framework,权限,permissions
From: https://www.cnblogs.com/xwltest/p/18209472

相关文章

  • 2024-05-23 闲话
    今天看Friends的时候听到了这首歌。I'msingin'intherain,justsingin'intherain.Whatagloriousfeeling,I'mhappyagain.I'mlaughin'atclouds,sodarkupabove.Thesun'sinmyheartandI'mreadyforlove.Letthesto......
  • 【DRF-04】rest-framework之认证
    1.认证基本使用1.1:问题:有些API(订单信息)需要用户登录成功之后,才能访问;有些无需登录就能访问。1.2:解决思路:用户登录后,生成token--保存在数据库中,前端带token,允许访问,不带token,不允许访问。1.3:modelsfromdjango.dbimportmodelsclassUserInfo(models.Model):......
  • 50-53-57 20240523
     50Shesawme,andwalkedover.Sheteeteredalittle,butitwasnotduetoheronde-tubercularleg.forherlimpwasalmostgone.teeter=towalkormoveunsteadilyorunsurely;totter;wobbletubercular=relatingtoorsufferingfromtuberculosis1这段文字描述......
  • Android11快速编译并替换framework.jar
    Android11快速编译并替换framework.jar在Android11之前修改了framework相关代码,只需makeframework就可以编译出framework.jar。在Android11,这个编译命令不起作用了,根据framework/base/目录下Android.bp中的提示:java_library{name:"framework-minus-apex",defaults:......
  • CSP历年复赛题-P1046 [NOIP2005 普及组] 陶陶摘苹果
    原题链接:https://www.luogu.com.cn/problem/P1046题意解读:30+伸手的高度,能够得着几个苹果。解题思路:直接模拟。100分代码:#include<bits/stdc++.h>usingnamespacestd;inta[15],h,ans;intmain(){for(inti=1;i<=10;i++)cin>>a[i];cin>>h;......
  • P10513 括号
    P10513括号一、题目简析本题采用线段树求解。节点的定义structnode{ intl,r; intlcnt,rcnt;//lcnt--(的个数;rcnt--)的个数 intans,anti;//ans--()的个数;anti--)(的个数 booltag;//true--需要翻转左右孩子}tree[N......
  • 2024-05-22:用go语言,你有一个包含 n 个整数的数组 nums。 每个数组的代价是指该数组中
    2024-05-22:用go语言,你有一个包含n个整数的数组nums。每个数组的代价是指该数组中的第一个元素的值。你的目标是将这个数组划分为三个连续且互不重叠的子数组。然后,计算这三个子数组的代价之和,要求返回这个和的最小值。输入:nums=[1,2,3,12]。输出:6。答案2024-05-22:cha......
  • 【DRF-03】rest-framework之APIView
    安装djangorestframeworkpipinstalldjangorestframework基本流程:url--》视图类--》执行dispatch方法fromrest_framework.viewsimportAPIViewfromrest_framework.responseimportResponseclassTestView(APIView):defdispatch(self,request,*args,*......
  • 2022-05-31-dkm_1-1-新增熵值法功能
    DKM的新版本,新增了熵值法(截面)功能。使用一如既往的简单明了,准备数据如下图:其中X表示正向指标,Y表示负向指标,软件截面操作如下:输入S,回车即可得到结果文件。最近会更新CCM因果检验算法模块,需要的同学请留意。需要的同学,可以扫描二维码购买。若您有其他想要使用的模型,却苦于......
  • 2022-05-21-空间马尔科夫链工具
    今日推出的是包含传统马尔可夫链与空间马尔可夫链的工具,不涉及stata、matlab、R,无需代码,已经封装完毕,准备好数据即可得到结果。软件的界面,如下:图1关于该工具的准确性验证如下:图2图3图4图5其中,图3和图5,为软件所计算数据,图2和图4为论文披露结果。可以看到,传统马尔可夫......