【Django】DRF身份认证、流量控制

这里所说的身份认证和流量控制都是DRF中的APIView提供的功能

APIView会在进行dispatch()分发前,对请求进行身份认证、权限检查、流量控制

1.身份认证

身份认证可以配置全局(在Django的配置文件)或局部(在视图类),当配置了局部,全局会失效

1.1 全局配置

在settings.py添加一个REST_FRAMEWORK字典

REST_FRAMEWORK = {
    
    
    # 默认配置,即针对所有的drf视图
    'DEFAULT_AUTHENTICATION_CLASS':(
        # 基本认证,校验用户名和密码
        "rest_framework.authentication.BasicAuthentication",
        # 在DRF视图(APIView)处理一个请求的过程中,会提取cookie中的sessionid,并在缓存中获取用户数据
        'rest_framework.authentication.SessionAuthentication',
    ),

    # 权限后端,有多个权限后端,默认遵循最严格的那个
    'DEFAULT_PERMISSION_CLASSES':(
        # 以下4种控制方式,根据实际情况开启一种即可
        'rest_framework.permissions.IsAuthenticated', # 只有经过身份验证的用户才能访问
        # 'rest_framework.permissions.IsAdminUser', # 允许管理员,即is_staff=True才能访问
        # 'rest_framework.permissions.AllowAny', # 允许任何人,包括匿名用户
        # 'rest_framework.permissions.IsAuthenticatedOrReadOnly', # 认证,或者只读
    ),
1.2 局部配置

一旦在局部进行了配置,全局配置便会失效

views.py

from rest_framework.permissions import AllowAny
from rest_framework.viewsets import ModelViewSet
from rest_framework.authentication import SessionAuthentication
# re_path(r'^books/$',views.BooksView.as_view()),
class BooksView(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer
    # 在局部配置之后,全局配置便会失效
    authentication_classes = [SessionAuthentication]
    permission_classes = [AllowAny]
    ...

2.流量控制

流量控制,就是限制访问次数,可以针对不同用户限制不同次数,或者根据视图

2.1 全局配置

settings.py

REST_FRAMEWORK = {
    
    

    # 流量控制
    'DEFAULT_THROTTLE_CLASSES':(
        'rest_framework.throttling.AnonRateThrottle', # 匿名用户访问限制
        'rest_framework.throttling.UserRateThrottle', # 非匿名用户访问限制
        'rest_framework.throttling.ScopedRateThrottle', # 自定义流量后端
    ),
    # 流量限制(访问)次数
    'DEFAULT_THROTTLE_RATES':{
    
    
        # 限制用户访问次数
        'anon':'3/day',  # 单位
        'user':'5/day',
        # 自定义限流后端访问次数
        'books':'3/day',
        'heros':'5/day'
    },
}

views.py

class BooksView(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

	...

    # 指定自定义限流规则
    throttle_scope = 'books'
2.2 局部配置

一旦有局部配置,全局配置便会失效

views.py

from rest_framework.throttling import AnonRateThrottle,UserRateThrottle,ScopedRateThrottle
class BooksView(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    # 指定自定义限流规则
    throttle_scope = 'books'
    # 针对当前视图,定义的限流后端
    throttle_classes = [ScopedRateThrottle]
    

猜你喜欢

转载自blog.csdn.net/qq_39147299/article/details/108759084