权限类与频率类

权限类

主要用途:用户登录了,某个接口可能只有超级管理员才能访问,普通用户不能访问

案列:出版社的所有接口,必须登录,而且是超级管理员才能访问

分析步骤

第一步:写一个类,继承BasePermission
第二步:重写has_permission方法
第三步:在方法校验用户时候有权限(request.user就是当前登录用户)
第四步:如果有权限,返回True,没有权限,返回FALSE
第五步:self.message 是给前端的提示信息
第六步:局部使用,全局使用,局部禁用

model.py

class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    user_type = models.IntegerField(default=3, choices=((1, '超级管理员'), (2, '普通用户'), (3, '2b用户')))

    def __str__(self):
        return self.username

permission.py

from rest_framework.permissions import BasePermission


class UserTypePermission(BasePermission):
    def has_permission(self, request, view):
        # 只有超级管理员有权限
        if request.user.user_type == 1:
            return True  # 有权限
        else:
            """
            self.message = '普通用户和2b用户都没有权限'
            self.message = '您是:%s 用户,您没有权限'%request.user.get_user_type_display()
            """
            return False  # 没有权限

"""
self.message = '普通用户和2b用户都没有权限' 
    返回给前端的提示是什么样

self.message = '您是:%s 用户,您没有权限'%request.user.get_user_type_display()
    使用了choice后,user.user_type 拿到的是数字类型,想变成字符串 user.get_user_type_display()
"""

image
view.py

# 导入我们所写的那个权限文件
from .permission import UserTypePermission
# 要验证必须要登录,下面的这种方式是局部权限使用
class PublishView(ViewSetMixin, ListCreateAPIView):
    # 登录验证
    authentication_classes = [LoginAuth, ]
    # 权限验证
    permission_classes = [UserTypePermission, ]
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer


class PublishDetailView(ViewSetMixin, RetrieveUpdateDestroyAPIView):
    # 登录验证
    authentication_classes = [LoginAuth, ]
    # 权限验证
    permission_classes = [UserTypePermission, ]
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer

settings.py

全局权限验证:(要在setting.py文件中配置)

全局验证需要注意的是在登录的时候需要添加局部禁用
    permission_classes = []
    authentication_classes = []


REST_FRAMEWORK = {
    # 'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.LoginAuth', ]
    'DEFAULT_PERMISSION_CLASSES': ['app01.permission.UserTypePermission', ]
}

# 全局的加上以后局部的就可以注释掉了

内置权限类
注意如果要使用内置的权限类就需要用全套(认证和权限都要用内置的)

# 演示一下内置权限的使用:IsAdminUser,控制是否对网站后台有权限的人
# 1 创建超级管理员
# 2 写一个测试视图类
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication
class TestView3(APIView):
    authentication_classes=[SessionAuthentication,]
    permission_classes = [IsAdminUser] # 这两个都要用内置的
    def get(self,request,*args,**kwargs):
        return Response('这是22222222测试数据,超级管理员可以看')
# 3 超级用户登录到admin,再访问test3就有权限
# 4 正常的话,普通管理员,没有权限看(判断的是is_staff字段)

频率类

认证,权限都通过以后,我们可以限制某个接口的访问频率,防止有人恶意攻击网站,一般根据ip或者用户限制

自定义频率类

案例:无论是否登录和是否有权限,都要限制访问的频率,比如一分钟访问3次

分析步骤:

第一步:写一个类:继承SimpleRateThrottle
第二步:重写get_cache_key,返回唯一的字符串,会以这个字符串做频率限制
第三步:写一个类属性scope=‘随便写’,必须要跟配置文件对象
第四步:配置文件中写
    'DEFAULT_THROTTLE_RATES': {
        '随意写': '3/m'  # 3/h  3/s  3/d
        }
第五步:局部配置,全局配置,局部禁用

throttling.py(SimpleRateThrottle)

from rest_framework.throttling import BaseThrottle, SimpleRateThrottle


# 我们继承SimpleRateThrottle去写,而不是继承BaseThrottle去写
class TimeThrottling(SimpleRateThrottle):
    # 类属性,这个类属性可以随意命名,但要跟配置文件对应
    scope = 'throttling'
    
    def get_cache_key(self, request, view):
        """
        # 返回什么,频率就以什么做限制
        # 可以通过用户id限制
        # 可以通过ip地址限制
        """
        return request.META.get('REMOTE_ADDR') # 这个就是根据用户ip进行限制

局部配置

class PublishView(ViewSetMixin, ListCreateAPIView):
    authentication_classes = [LoginAuth, ]
    # permission_classes = [UserTypePermission, ]
    # 局部频率验证,每分钟只能访问五次
    throttle_classes = [TimeThrottling, ]
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer


class PublishDetailView(ViewSetMixin, RetrieveUpdateDestroyAPIView):
    authentication_classes = [LoginAuth, ]
    # permission_classes = [UserTypePermission, ]
    # 局部频率验证,每分钟只能访问五次
    throttle_classes = [TimeThrottling, ]
    queryset = Publish.objects.all()
    serializer_class = PublishSerializer

全局配置

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': ['app01.throttling.TimeThrottling', ],
    'DEFAULT_THROTTLE_RATES': {
        'throttling': '5/m'  # 一分钟访问5次
    }
}

内置频率类

限制未登录用户

# 全局使用  限制未登录用户1分钟访问5次
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '3/m',
    }
}
#views.py
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
class TestView4(APIView):
    authentication_classes=[]
    permission_classes = []
    def get(self,request,*args,**kwargs):
        return Response('我是未登录用户')

# 局部使用
from rest_framework.permissions import IsAdminUser
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.throttling import AnonRateThrottle
class TestView5(APIView):
    authentication_classes=[]
    permission_classes = []
    throttle_classes = [AnonRateThrottle]
    def get(self,request,*args,**kwargs):
        return Response('我是未登录用户,TestView5')

限制登录用户的访问频次

全局:在setting中
  'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'user': '10/m',
        'anon': '5/m',
    }
        
 局部配置:
	在视图类中配一个就行

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:权限类与频率类 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • 文章的评论(跟评论与子评论的制作)

    文章的评论制作 先做跟评论,在做子评论 发表评论框的制作:前端渲染发表评论框: {# 评论功能开始#} {% if request.user.is_authenticated %} <div> <p><span class=”glyphicon glyphicon-comment”>发表评论:</span>&l…

    2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    2023年4月2日
    00
  • flask基础介绍和语法

    flask基础介绍和语法 flask项目初始化的app.py介绍 # 从flask包中导入flask类 from flask import Flask # 使用flask类实例化出一个app对象 # __name__:代表当前app.py这个模块 app = Flask(__name__) # 创建一个路由和视图的映射 @app.route(‘/’) def…

    2023年4月2日
    00
  • django的基本介绍与操作

    django的基本操作 1.django的安装 (1)在ubuntu上的安装 sudo pip3 install django==2.1.12(版本号) 检查安装是否成功: sudo pip3 freeze|grep -i ‘Django’ 有输出django==2.2.12 表示安装成功 (2)在windows上的安装 在终端执行 pip3 install…

    2023年4月2日
    00
  • 认证

    认证的实现 使用步骤: # 通过认证类完成,使用步骤 1 写一个认证类,继承BaseAuthentication 2 重写authenticate方法,在内部做认证 3 如果认证通过,返回2个值 4 认证不通过抛AuthenticationFailed异常 5 只要返回了两个值,在后续的request.user 就是当前登录用户 认证源码分析: https:…

    Python开发 2023年4月2日
    00
  • 小程序用户和登录页面展示

    用户页面wxml <!–pages/home/home.wxml–> <view class=”container”> <view class=”top-view”> <view class=”user”> <view class=”row”> <image class=”avatar” …

    Python开发 2023年4月2日
    00
  • django中APIView里的dispatch和as_view方法分析

    位置: from rest_framework.views import APIView 继承APIView类视图形式的路由: path(‘booksapiview/’, views.BooksAPIView.as_view()), #在这个地方应该写个函数内存地址 继承APIView类的视图函数: from rest_framework.views imp…

    Python开发 2023年4月2日
    00
  • django中CBV视图模式的View源码分析

    位置: 1.找到自己项目用的解释器存储位置H:\pythonProject\Lib\site-packages\django\views\generic\base.py在base.py里有一个View类 2.也可以通过from django.views import View 按住ctrl点击View会直接跳到该类的位置 CBV形式的路由 path(r’^l…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部