python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)

认证、权限、限流功能组件详解

  • 准备工作
  • 认证 Authentication
    • 局部设置
      • 自定义认证组件
    • 全局配置
  • 权限 Permissions
    • 局部配置
      • 提供的权限类
      • 自定义权限组件
    • 全局配置
  • 限流 Throttling
    • 局部配置
      • 提供的限流类

准备工作

首先我们为了方便下面的练习,先创建一个新的子应用api

python manage.py startapp api

注册创建的子应用:

INSTALLED_APPS = [
    ...
    'api',     # drf的组件使用
]
  • 因为接下来的认证组件中需要使用到登陆功能,所以我们使用django内置admin并创建一个超级管理员
  • admin站点的访问地址:http://127.0.0.1:8000/admin
  • 在终端行运行下述命令创建超级管理员
python manage.py createsuperuser

python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第1张图片

  • 你也可以修改你已经创建好的超级管理员的密码:
python manage.py changepassword 用户名
  • 创建完成后,访问管理员站点并登录成功后,显示如下:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第2张图片
  • 管理员站点语言为英文,当然,也可以切换成中文!!!
    在settings.py文件中修改即可:
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'

修改完成,重新运行项目即可完成语言的切换:
python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第3张图片

认证 Authentication

可以在配置文件中配置全局默认的认证方法,查看全局的默认配置:

DEFAULTS = {
...
 'DEFAULT_AUTHENTICATION_CLASSES': [
     'rest_framework.authentication.SessionAuthentication', # session认证
     'rest_framework.authentication.BasicAuthentication'   # 基本认证
 ],
...
}

常见的认证方式:cookie、session、token

局部设置

  • 可以在具体的视图类中通过设置authentication_classess类属性来设置单独的不同的认证方式
from rest_framework import status
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.response import Response
from rest_framework.views import APIView


class StudentsView(APIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication]

    def get(self, request):
        if not request.user.id:
            return Response({'msg': '未验证通过!!'}, status=status.HTTP_401_UNAUTHORIZED)
        return Response({'msg': '验证成功!!'}, status=status.HTTP_200_OK)
  • 登录成功后,显示页面:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第4张图片
  • 未登录,显示页面:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第5张图片

自定义认证组件

  • 也可以自定义认证组件:
from django.contrib.auth import get_user_model
from rest_framework.authentication import BaseAuthentication


class UserAuthentication(BaseAuthentication):
    """
    自定义认证方法
    """

    def authenticate(self, request):
        """
        认证方法
        :param request: 客户端发送的http请求对象
        :return: True: (user,None)  False: (None)
        """
        user = request.query_params.get('user')
        pwd = request.query_params.get('pwd')
        if user != 'ycx' and pwd != '........':
            return None

        user = get_user_model().objects.first()
        return (user, None)
  • 自定义认证:从路由地址中获取信息,判断用户名与密码是否验证通过,不通过固定返回None,通过返回(user, None)
  • 然后在视图中的authentication_classes进行引用使用:
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from .authentication import UserAuthentication


class StudentsView(APIView):
    authentication_classes = [UserAuthentication]

    def get(self, request):
        if not request.user.id:
            return Response({'msg': '未验证通过!!'}, status=status.HTTP_401_UNAUTHORIZED)
        return Response({'msg': '验证成功!!'}, status=status.HTTP_200_OK)
  • 认证通过:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第6张图片

  • 认证未通过:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第7张图片

  • 你可以在自定义的权限组件中实现复杂的业务逻辑,来判断此用户是否为此网站的用户

全局配置

  • 在settings.py文件中的REST_FRAMEWORK中进行配置:
"""drf配置信息必须全部写在REST_FRAMEWORK配置项中"""
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'api.authentication.UserAuthentication',          # 自定义认证
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',    # 基本认证
    )
}

权限 Permissions

局部配置

权限控制可以限制用户对于视图的访问和对于具有模型对象的访问
对于用户的权限限制,共有两个方面:

  • 在执行视图的as_view()方法的dispatch()方法前,会先进行视图访问权限的判断
  • 在通过get_object()获取具体模型对象时,会进行模型对象访问权限的判断

提供的权限类

  • AllowAny 允许所有用户,默认权限
  • IsAuthenticated 仅通过登录认证的用户
  • IsAdminUser 仅管理员用户
  • IsAuthenticatedOrReadOnly 已经登陆认证的用户可以对数据进行增删改操作,没有登陆认证的只能查看数据
class StudentsPreView(GenericAPIView):
    """通用视图类:多个数据操作"""
    # 独特操作
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers
    authentication_classes = [SessionAuthentication]
    permission_classes = [IsAuthenticatedOrReadOnly]

    def get(self, request):
        # 获取查询到的模型数据集
        ser = StudentModelSerializers(instance=self.get_queryset(), many=True)
        return Response(ser.data, status=status.HTTP_200_OK)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        # raise_exception:自动将报错信息返回给页面
        ser.is_valid(raise_exception=True)
        ser.save()

        return Response(ser.data, status=status.HTTP_201_CREATED)
  • 上述使用的IsAuthenticatedOrReadOnly权限类为:登录认证的用户可以查看、修改数据,未登录的用户只能查看数据
    未登录页面显示:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第8张图片
  • 登录用户页面显示:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第9张图片
  • 登录用户的最下方提供增加数据的权限

自定义权限组件

如需自定义权限,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部

  • .has_permission(self, request, view):是否可以访问视图, view表示当前视图对象,返回值:True或False,允许访问视图或不允许

  • .has_object_permission(self, request, view, obj):是否可以访问模型对象, view表示当前视图对象, obj为模型数据对象,返回值:True或False,允许访问模型对象或不允许

  • 定义:自定义permissions.py文件:

from rest_framework.permissions import BasePermission


class StudentsPermission(BasePermission):
    """
    自定义权限组件:全局配置或局部配置
    """

    def has_permission(self, request, view):
        """
        视图权限
        :param request:请求对象
        :param view:要访问的视图类
        :return:True或False
        """
        # 获取
        name = request.query_params.get('name')
        return name == 'ycx'

    def has_object_permission(self, request, view, obj):
        """
        模型权限
        :param request:请求对象
        :param view:访问视图对象
        :param obj:模型数据对象
        :return:True或False
        """
        return True
  • 调用:在视图文件中引入自定义的权限认证类,再将此认证类添加到permission_classes中,即可完成调用!!
  • 我们在这里定义的权限类为:从路由中获取用户姓名信息,判断此用户是否具有访问视图与模型的权限
  • 未添加用户信息:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第10张图片
  • 添加正确的用户信息:
    python Django Rest_Framework框架 认证、权限、限流功能组件详解(图文并茂版)_第11张图片

全局配置

  • 在settings.py文件中的REST_FRAMEWORK中进行配置:
REST_FRAMEWORK = {
    # 认证全局配置
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'api.authentication.UserAuthentication',  # 自定义认证
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',  # 基本认证
    ),
    # 权限全局配置
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        'api.permissions.StudentsPermission'  # 自定义权限
    ]
}

限流 Throttling

  • 限流组件,可以对接口访问的频次进行限制,以减轻服务器压力,或者实现特定的业务
  • 作用:一般用于付费购买次数,投票等场景使用

局部配置

提供的限流类

  • AnonRateThrottle:限制所有匿名未认证用户,使用IP区分用户

使用DEFAULT_THROTTLE_RATES[‘anon’] 来设置频次

  • UserRateThrottle:限制认证用户,使用User模型的 id主键来区分

使用DEFAULT_THROTTLE_RATES[‘user’] 来设置频次

  • ScopedRateThrottle:限制用户对于每个视图的访问频次,使用ip或用户id
class StudentsPreView(GenericAPIView):
    """通用视图类:多个数据操作"""
    # 独特操作
    queryset = Students.objects.all()
    serializer_class = StudentModelSerializers
    # 限流
    throttle_classes = [UserRateThrottle]

    def get(self, request):
        # 获取查询到的模型数据集
        ser = StudentModelSerializers(instance=self.get_queryset(), many=True)
        return Response(ser.data, status=status.HTTP_200_OK)

    def post(self, request):
        ser = self.get_serializer(data=request.data)
        # raise_exception:自动将报错信息返回给页面
        ser.is_valid(raise_exception=True)
        ser.save()

        return Response(ser.data, status=status.HTTP_201_CREATED)

在settings.py文件中配置访问频次:

 # 限流频率配置
 'DEFAULT_THROTTLE_RATES': {  # 频率配置
     'anon': '2/day',  # 针对游客的访问频率进行限制
     'user': '5/day',  # 针对登录用户的访问频率进行限制
 }

你可能感兴趣的:(DRF框架,python,django,序列化器,DRF)