一、身份认证、权限检查
- 在Django的配置文件settings.py文件中添加下列配置项:
(1)配置Redis数据库
(2)配置认证后端 - 全局配置:(全局配置作用于DRF所有的视图)
CACHES = {
# 默认存储信息: 存到 0 号库
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://192.168.203.153:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
# session引擎
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
# 指定session使用的缓存配置
SESSION_CACHE_ALIAS = "default"
# REST_FRAMEWORK配置项对"drf接口"进行全局配置
REST_FRAMEWORK = {
# 身份认证后端——如果有多个认证,则有一个认证通过就算认证成功
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', # 基本认证 —— 请求的时候传递用户名和密码,进行身份认证
# 在drf视图(APIView)处理一个请求的过程中,会提取cookie中的sessionid,并在缓存中获取用户数据
# 'rest_framework.authentication.SessionAuthentication', # session认证
# ......
),
# 权限认证后端,有多个权限后端,遵循最严格的
'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.permissions.IsAdminUser',
# is_staff=True或者1才能访问 —— 管理员(员工)权限,如果is_staff=False,就算是is_superuser虽然是最高用户(老板),也没有访问权限(不圆滑~)
- 局部配置:(** 视图的局部配置会隐藏全局配置**)
authentication_classes = [SessionAuthentication]
如果列表为空,则意味着无需进行身份认证,也无需权限认证(相当于允许所有人访问)
from rest_framework.authentication import SessionAuthentication
class BooksView(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
# 针对当前视图,定义局部认证后端
authentication_classes = [SessionAuthentication]
# 针对当前视图,定义权限后端
permission_classes = [IsAdminUser]
@action(methods=['get'], detail=False, url_path='latest')
def latest(self, request, *args, **kwargs):
user = request.user
book = self.queryset.latest('bpub_date') # 最新发布的书
serializer = self.get_serializer(instance=book)
return Response(data=serializer.data)
二、流量限制——是APIView
提供的功能;限制接口请求次数;
(同样,如果是在视图函数中配置局部限制,也会隐藏全局配置)
- 全局配置
- 自定义限流后端:用于限流某一个视图函数接口
# REST_FRAMEWORK配置项对"drf接口"进行全局配置
# 全局配置针对所有的drf视图(接口)
REST_FRAMEWORK = {
# ......
# 流量限制后端
'DEFAULT_THROTTLE_CLASSES': (
# 'rest_framework.throttling.AnonRateThrottle', # 限制匿名用户访问限制
# 'rest_framework.throttling.UserRateThrottle', # 非匿名用户访问限制
'rest_framework.throttling.ScopedRateThrottle', # 自定义限流后端
),
# 流量(请求次数)限制频率
'DEFAULT_THROTTLE_RATES': {
'anon': '3/day', # 匿名用户访问次数 3/day 3/hour 3/second 3/minute
'user': '5/day', # 非匿名用户访问次数
# 自定义限流后端的访问次数规则
'books': '3/day',
'heros': '5/day'
},
}
- 局部配置
class BooksView(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
# 针对当前视图,定义限流后端
throttle_classes = [UserRateThrottle] # 意思是只限制有身份的用户访问次数
@action(methods=['get'], detail=False, url_path='latest')
def latest(self, request, *args, **kwargs):
user = request.user
book = self.queryset.latest('bpub_date') # 最新发布的书
serializer = self.get_serializer(instance=book)
return Response(data=serializer.data)
-
自定义限流后端演示:
-
视图函数
再定义一个英雄视图接口(注意添加路由)。
结论:英雄只能访问5次/天,图书只能访问3次/天
# 英雄视图接口
class HerosView(ModelViewSet):
queryset = HeroInfo.objects.all()
serializer_class = HeroInfoModelSerializer
# 指定自定义限流规则
throttle_scope = 'heros'
# 图书视图接口
class BooksView(ModelViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoModelSerializer
# 指定自定义限流规则
throttle_crope = 'books'
- 添加英雄视图接口的路由映射
urlpatterns = [
path('admin/', admin.site.urls),
]
# 1、实例化路由对象
# router = SimpleRouter()
router = DefaultRouter()
# 2、注册视图集(指定映射规则,如:路由前缀)
router.register(prefix='heros', viewset=HerosView, base_name='heros')
# 3、把生成的路由映射router.urls -->[re_path(), re_path()....],加入路由列表urlpatterns中
# urlpatterns.extend(router.urls)
urlpatterns += router.urls