首页 > 其他分享 >6.三大认证等

6.三大认证等

时间:2024-08-01 10:39:28浏览次数:15  
标签:name get request price queryset 认证 filter 三大

【一】三大认证

# 认证
self.perform_authentication(request)
# 权限
self.check_permissions(request)
# 频率
self.check_throttles(request)

【二】认证

1)使用

  • 新建一个py文件(authentication.py)

  • 写一个类继承BaseAuthentication

  • 重写authenticate函数

    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from App.models import Token
    
    class LoginAuthentication(BaseAuthentication):
        def authenticate(self, request):
            # 取出请求头中的token数据
            token = request.META.get('HTTP_TOKEN')
            # 校验登录token是否有效
            user_token = Token.objects.filter(token=token).first()
            if user_token:
                # 返回用户,token
                return user_token.user, token
            else:
                # 主动抛异常
                raise AuthenticationFailed('请先登录')
    
  • 将认证类配置到视图类内

    # 局部配置
    authentication_classes = [LoginAuthentication]
    # 全局配置
    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'App.base.authentication.LoginAuthentication'
        ]
    }
    

【三】权限

1)使用

  • 新建一个py文件(permissions.py

  • 写一个类继承BasePermission

  • 重写has_permission函数

    from rest_framework.permissions import BasePermission
    
    class CommonPermission(BasePermission):
        def has_permission(self, request, view):
            # view.action:请求状态
            if view.action == 'list' or view.action == 'retrieve':
                return True
            else:
                limit = request.user.limit
                if limit == 1:
                    return True
                else:
                    self.message = f'当前为【{request.user.get_limit_display()}】登录,权限不足'
                    return False
    
  • 将认证类配置到视图类内

    # 局部配置
    permission_classes = [CommonPermission]
    # 全局配置
    REST_FRAMEWORK = {
        'DEFAULT_PERMISSION_CLASSES': [
            'App.base.permissions.CommonPermission'
        ]
    }
    

【四】频率

1)使用

  • 新建一个py文件(throttles.py

  • 写一个类继承SimpleRateThrottle

  • 设置频率

    # 支持的时间:s,m,h,d
    # 每分钟3次
    rate = '3/m'	
    
  • 重写get_cache_key函数

    # SimpleRateThrottle 内继承了 BaseThrottle
    from rest_framework.throttling import SimpleRateThrottle
    
    class CommonThrottle(SimpleRateThrottle):
        # 设置频率(每分钟3次)(s,m,h,d)
        rate = '3/m'
    
        def get_cache_key(self, request, view):
            print(request.META)
            # 以返回的内容作为限制
            ip = request.META.get('REMOTE_ADDR')
            return ip
    
  • 将认证类配置到视图类内

    # 局部配置
    throttle_classes = [CommonThrottle]
    # 全局配置
    REST_FRAMEWORK = {
        'DEFAULT_THROTTLE_RATES':[
            'App.base.throttling.CommonThrottle'
        ]
    }
    

【五】排序,过滤

1)排序

  • 引入

    from rest_framework.filters import OrderingFilter
    
  • 添加到视图类内

    # 排序
    # 需注册排序依据,才能使用
    # http://localhost:8000/api/v1/book/?ordering=price,-id
    # 哪个依据在前,就先按照那个排序
    filter_backends = [OrderingFilter]
    ordering_fields = ['price', 'id']
    

2)过滤

1.方式一:drf内置方法,只能使用search进行模糊查询

  • 引入

    from rest_framework.filters import SearchFilter
    
  • 添加到视图类内

    # 需注册排序依据,才能使用
    # http://localhost:8000/api/v1/book/?search=书
    filter_backends = [SearchFilter]
    search_fields = ['name']
    

2.方式二:第三方django_filter,只能精确查询

  • 引入

    from django_filters.rest_framework.backends import DjangoFilterBackend
    
  • 添加到视图类内

    # 需注册排序依据,才能使用
    # http://localhost:8000/api/v1/book/?name=书1&price=80
    filter_backends = [ DjangoFilterBackend]
    filterset_fields = ['name','price']
    

3.方式三:自定义过滤

  • 新建一个py文件(filters.py

  • 写一个类继承BaseFilterBackend

  • 重写filter_queryset函数

    __contains:模糊查询
    __gt:大于查询
    __lt:小于查询
    __gte:大于等于查询
    __lte:小于等于查询
    
    from django.db.models import Q
    from rest_framework.filters import BaseFilterBackend
    
    
    class CommonFilterBackend(BaseFilterBackend):
        def filter_queryset(self, request, queryset, view):
            name = request.query_params.get('name')
            price = request.query_params.get('price')
            price_gt = request.query_params.get('price_gt')
            price_lt = request.query_params.get('price_lt')
            if name and price_gt and price_lt:
                queryset = queryset.filter(name__contains=name, price__gt=price_gt, price__lt=price_lt)
            elif price_gt and price_lt:
                queryset = queryset.filter(price__gt=price_gt, price__lt=price_lt)
            elif name and price:
                queryset = queryset.filter(Q(name__contains=name) | Q(price=price))	# 或关系
            elif name:
                # 模糊查询
                queryset = queryset.filter(name__contains=name)
            elif price:
                # 精确查询
                queryset = queryset.filter(price=price)
            return queryset
    
  • 将认证类配置到视图类内

    # 局部配置
    filter_backends = [CommonFilterBackend]
    # 全局配置
    REST_FRAMEWORK = {
        'DEFAULT_FILTER_BACKENDS': [
             'App.base.filters.CommonFilterBackend'
         ]
    }
    
  • 使用

    http://localhost:8000/api/v1/book/?name=书&price=30
    

【六】分页

  • 新建一个py文件(pagination.py

  • 写一个类继承PageNumberPagination

  • 定义函数

    from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination
    
    # 基本分页
    class CommonPagination(PageNumberPagination):
        # 默认一页显示的数量
        page_size = 2
        # 指定页数的key
        # http://localhost:8000/api/v1/book/
        # http://localhost:8000/api/v1/book/?p=2
        page_query_param = 'page'
        # 指定显示的数量的key
        # http://localhost:8000/api/v1/book/?s=3
        page_size_query_param = 'size'
        # 每页最大显示数量
        max_page_size = 5
       
    # 可指定每页的数据
    class CommonLimitOffsetPagination(LimitOffsetPagination):
        # 默认一页显示的数量
        default_limit = 2
        # 指定页数的key
        limit_query_param = 'limit'
        # 偏移量的key
        offset_query_param = 'offset'
        # 每页最大显示数量
        max_limit = 5
        # http://localhost:8000/api/v1/book/
        # http://localhost:8000/api/v1/book/?limit=2&offset=2
      
    # 无法预测每页的参数,
    class CommonCursorPagination(CursorPagination):
        # 默认一页显示的数量
        page_size = 2
        # 指定页数的key
        cursor_query_param = 'cursor'
        # 排序依据的字段
        ordering = 'id'
    
  • 将认证类配置到视图类内

    # 局部配置
    pagination_class = CommonPagination
    

【七】全局异常

1)3大类异常

  • drf的异常
  • django的异常
  • python的异常

2)使用

  • 新建一个py文件(abnormity.py

  • 引入

    from rest_framework.views import exception_handler
    
  • 定义函数

    def common_exception_handler(exc, context):
        # 日志记录
        request = context.get('request')
        view = context.get('view')
        print(f'时间:{time.time()},'
              f'用户:{request.user.username or "未知用户"},'
              f'访问地址:{request.get_full_path()},'
              f'请求方式:{request.method},'
              f'视图类:{str(view)}')
        # -----------------
        # 异常错误处理,统一返回格式
        response = exception_handler(exc, context)
        # drf的异常返回对象,其余返回None
        if response:
            if isinstance(response.data, dict):
                msg = response.data.get("detail") or '未知错误'
            elif isinstance(response.data, list):
                msg = response.data[0]
            return Response({'code': 100, 'msg': msg})
        else:
            return Response({'code': 100, 'msg': str(exc)})
    
  • 将认证类配置到视图类内

    # 使用全局配置
    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'App.base.exception.common_exception_handler'
    }
    

标签:name,get,request,price,queryset,认证,filter,三大
From: https://www.cnblogs.com/Mist-/p/18336160

相关文章

  • LKT4304芯片对比认证方案
    对比案应用模式固定,调试简单,MCU主控端只需要移植对称加密算法和简单的加密操作即可,不需对主控MCU端原有程序做大的改动。同时也不需要用户了解加密芯片内部运行流程,因此调试周期短,研发投入小。凌科芯安公司提供相应的Demo例程,用户直接移植即可使用。 对比认证方案实现的步骤如下......
  • 搭建 STM32 网关服务器的全流程:集成嵌入式 C++、TCP/IP 通信、Flash 存储及 JWT 认证(
    引言随着物联网(IoT)技术的快速发展,基于STM32的服务器(类似网关)在数据采集、设备控制等方面的应用越来越广泛。本文将介绍搭建一个基于STM32的服务器所需的技术栈,以及详细的搭建步骤和代码示例。技术栈介绍在搭建基于STM32的服务器时,我们需要用到以下技术栈和组件:1.硬......
  • PHP如何实现登录认证和鉴权
    本文由ChatMoney团队出品在Web开发中,用户认证(Authentication)和授权(Authorization)是构建安全应用程序的核心组件。用户认证是验证用户身份的过程,确保用户是他们声称的那个人。而授权则是确定已认证用户是否有权访问特定资源或执行特定操作的过程。PHP框架通过提供内置机制或集......
  • PHP框架中用户认证和授权的实现方法与示例
    本文由ChatMoney团队出品在Web开发中,用户认证(Authentication)和授权(Authorization)是构建安全应用程序的核心组件。用户认证是验证用户身份的过程,确保用户是他们声称的那个人。而授权则是确定已认证用户是否有权访问特定资源或执行特定操作的过程。PHP框架通过提供内置机制或集......
  • LKT4304芯片对比认证方案
    对比案应用模式固定,调试简单,MCU主控端只需要移植对称加密算法和简单的加密操作即可,不需对主控MCU端原有程序做大的改动。同时也不需要用户了解加密芯片内部运行流程,因此调试周期短,研发投入小。凌科芯安公司提供相应的Demo例程,用户直接移植即可使用。对比认证方案实现的步骤如下:......
  • WGS84、GCJ-02、BD09三大坐标系详解
    文章目录前言WGS84坐标系定义应用WGS84Web墨卡托投影GCJ-02坐标系(火星坐标系)定义应用GCJ-02经纬度投影与Web墨卡托投影BD09坐标系(百度坐标系)定义应用BD09经纬度投影与Web墨卡托投影坐标系之间的区别与注意事项总结前言WGS84、GCJ02、BD09坐标系互转在地理信......
  • ITSS三级认证需要多少钱?
    信息技术服务标准(ITSS)认证是评估一个企业在信息技术服务领域能力的标准之一,它涵盖了从基础标准、支撑标准到基于业务的需求侧和供给侧标准的全面内容。具体条件独立法人地位:申请单位需要具有独立的法人地位,这是三级认证的基本要求之一。运维服务能力体系:申请单位必须已按照......
  • 忘记MySQL密码的处理措施(取消密码认证,直接登录)
    忘记MySQL密码/etc/my.cnf.d/mysql-server.cnf删除#号,取消注释skip-grant-tables选项下参数重启mysqld服务后,直接回车登录查看status状态直接修改密码无法成功,提示在skip-grant-tables选项下使用FLUSHPRIVILEGES;命令刷新权限即可回到上面删除掉skip-grant-tables......
  • 小一保姆级 python三大核心多态、抽象类、动态添加内容详解
    一.多态多态是面向对象编程中的一个核心概念,它允许一个接口被多个数据类型实现。这意味着,即使多个类具有不同的内部实现,它们也可以共享一个公共接口。多态的实现通常依赖于继承和方法重写。继承:子类继承父类的属性和方法。方法重写:子类重写父类中的方法,以提供特定的实现。......
  • mongo副本集开启安全认证
    线上mongo是四节点的副本集,其中一个节点是延迟并且隐藏不参与选举。由于业务的需要,现在需要开启mongo的安全认证。根据官网的介绍(https://www.mongodb.com/zh-cn/docs/manual/tutorial/enforce-keyfile-access-control-in-existing-replica-set-without-downtime/),可以采取不停机(t......