DRF基本视图——认证、权限和限流

一、身份认证、权限检查

  • 在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值