当前位置:   article > 正文

rest_framework_django学习笔记四(限流、权限)_django rest framework anonymoususer

django rest framework anonymoususer

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)
    ],
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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)
    ],
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

也可以在具体的视图中通过 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)# 权限
  • 1
  • 2
  • 3
  • 4
  • 5

提供的权限

  • 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",)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

使用

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二、限流 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 
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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
  • 2
  • 3
  • 4
  • 5
  • 6

可选限流类

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'
    ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
REST_FRAMEWORK = {
    # 限流
    "DEFAULT_THROTTLE_CLASSES":(
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    "DEFAULT_THROTTLE_RATES":{ # 限流频次
        'contacts':'1/minute',
        'uploads':'1/minute',
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

其他笔记

序列化器

视图路由

异常、登录认证

权限、限流

过滤、排序、分页

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/845588
推荐阅读
相关标签
  

闽ICP备14008679号