这里所说的身份认证和流量控制都是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]