rest_framework_django学习笔记四(限流、权限)

rest_framework_django学习笔记四(权限、限流)

一、权限

可以在配置文件中设置默认的权限管理类;

REST_FRAMEWORK = {
    "DATETIME_FORMAT": "%Y-%m-%d %H:%M:%S",  # 日期时间格式配置
    "DATE_FORMAT": "%Y-%m-%d",
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticated",  # 只有经过身份认证确定用户身份才能访问
        # 'rest_framework.permissions.IsAdminUser', # is_staff=True才能访问 —— 管理员(员工)权限
        # 'rest_framework.permissions.AllowAny', # 允许所有
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 有身份 或者 只读访问(self.list,self.retrieve)
    ],
}

如果未指定,则采用如下默认配置

REST_FRAMEWORK = {
    "DATETIME_FORMAT": "%Y-%m-%d %H:%M:%S",  # 日期时间格式配置
    "DATE_FORMAT": "%Y-%m-%d",
    "DEFAULT_PERMISSION_CLASSES": [
        #"rest_framework.permissions.IsAuthenticated",  # 只有经过身份认证确定用户身份才能访问
        # 'rest_framework.permissions.IsAdminUser', # is_staff=True才能访问 —— 管理员(员工)权限
          'rest_framework.permissions.AllowAny', # 允许所有
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 有身份 或者 只读访问(self.list,self.retrieve)
    ],
}

也可以在具体的视图中通过 permission_classes 属性

from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
class BookModelViewSet(ModelViewSet):
	authentication_classes = (SessionAuthentication,BasicAuthentication) # 认证
	permission_classes = (IsAuthenticated)# 权限

提供的权限

  • AllowAny 允许所有用户
  • IsAuthenticated 仅通过认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get 读取

自定义权限

如需要自定义权限,需要基础 rest_framework.permissions.BasePermission 父类,并实现一下两个任何一个方法或全部

  • .has_permission(self,request,view)

是否可用访问视图 view 表示当前视图对象;返回True则可用访问当前视图中的所有方法。当返回False则当前视图中的所有方法都不能访问。

  • .has_object_permisssion(self,request,view,obj)

是否可用访问数据对象,view 表示当前视图,obj 为数据对象

''' models.py '''
class ApiWhiteList(CoreModel):
    url = models.CharField(max_length=200, help_text="url地址", verbose_name="url")
    METHOD_CHOICES = (
        (0, "GET"),
        (1, "POST"),
        (2, "PUT"),
        (3, "DELETE"),
    )
    method = models.IntegerField(default=0, verbose_name="接口请求方法", null=True, blank=True,
                                 help_text="接口请求方法")
    enable_datasource = models.BooleanField(default=True, verbose_name="激活数据权限", help_text="激活数据权限",
                                            blank=True)

    class Meta:
        db_table = table_prefix + "api_white_list"
        verbose_name = "接口白名单"
        verbose_name_plural = verbose_name
        ordering = ("-create_datetime",)

import re
from django.contrib.auth.models import AnonymousUser
from django.db.models import F
from rest_framework.permissions import BasePermission
from .models import ApiWhiteList
class CustomPermission(BasePermission):
    """自定义权限"""
    def has_permission(self, request, view):
        if isinstance(request.user, AnonymousUser):
            return False
        # 判断是否是超级管理员
        if request.user.is_superuser:
            return True
        else: # 增加自定义逻辑 
            return False

使用

from django.db.models import Q
from rest_framework.viewsets import ModelViewSet
from rest_framework.decorators import action
from rest_framework.authentication import SessionAuthentication,BasicAuthentication
from rest_framework.permissions import IsAuthenticated
from .serializers import BookSerializer
from .models import Book
from rest_framework.response import Response
class BookModelViewSet(ModelViewSet):
	authentication_classes = [ssionAuthentication,BasicAuthentication]
	permission_classes = [IsAuthenticated,CustomPermission] # IsAuthenticated 登录后才能访问就必须增加 IsAuthenticated
	queryset = Book.objects.all()
	serializer_class = BookSerializer

二、限流 Throttling

可以对接口访问的频次进行限制,以减轻服务器压力。

配置

可以在配置文件中,使用 DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES 进行全局配置

REST_FRAMEWORK = {
    # 限流
    "DEFAULT_THROTTLE_CLASSES":(
        'rest_framework.throttling.AnonRateThrottle',# 限制所有匿名未认证用户,使用IP区分用户
        'rest_framework.throttling.UserRateThrottle',# 限制认证用户,使用 UserId 来区分
        ),
    "DEFAULT_THROTTLE_RATES":{ # 限流频次
        'anon':'100/day',# 匿名用户一天 100 次   second,minute,hour ,day 
        'user':'1000/day',# 认证用户一天 1000 次  second,minute,hour ,day 
    }
}

DEFAULT_THROTTLE_RATES 可以使用 second,minute,hour 或day 来指明周期

也可以在具体视图中通过 throttle_classess 属性来配置,如

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
	throttle_classes = (UserRateThrottle)
	...

可选限流类

1 AnonRateThrottle

限制所有匿名未认证用户,使用IP区分用户。

使用 DEFAULT_THROTES[‘anon’] 来设置 频次

2 UserRateThrottle

限制认证用户,使用 UserId 来区分

使用 DEFAULT_THROTTLE_RATES[‘user’] 来设置频次

3 ScopedRateThrottle

限制用户对于每个视图的防问频次,使用 ip或user id

class  ContactListView(APIView):
	throttle_scope = 'contacts'
	...
class  ContactDrtaiView(APIView):
	throttle_scope = 'uploads'
    ...
REST_FRAMEWORK = {
    # 限流
    "DEFAULT_THROTTLE_CLASSES":(
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    "DEFAULT_THROTTLE_RATES":{ # 限流频次
        'contacts':'1/minute',
        'uploads':'1/minute',
    }
}

在这里插入图片描述

其他笔记

序列化器

视图路由

异常、登录认证

权限、限流

过滤、排序、分页

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值