zoukankan      html  css  js  c++  java
  • DRF(5)

    一、频率组件

    1、使用DRF简单频率控制实现对用户进行访问频率控制

      1)导入模块,定义频率类并继承SimpleRateThrottle

    # 导入模块
    from rest_framework.throttling import SimpleRateThrottle
    
    # 定义频率类并继承SimpleRateThrottle
    class RateThrottle(SimpleRateThrottle):
        rate = '5/m'   # 指定访问频率,5/m表示 每分钟5次
    
        def get_cache_key(self, request, view):
            return self.get_ident(request)

      rate代表访问频率,上面表示每分钟五次,get_cache_key是必须存在的,它的返回值告诉当前频率控制组件要使用什么方式区分访问者(比如ip地址)。

      2)在视图中使用频率类

    from rest_framework.viewsets import ModelViewSet
    
    class BookView(ModelViewSet):
    
        authentication_classes = [UserAuth]  # 指定认证类
        permission_classes = [UserPerms]   # 指定权限类
        throttle_classes = [RateThrottle]  # 使用频率类
    
        queryset = Book.objects.all()
        serializer_class = BookSerializer

    2、全局访问频率控制

      首先定义一个频率控制类,并且必须继承SimpleRateThrottle这个类,它是DRF提供的一个方便的频率控制类,如下:

    from rest_framework.throttling import SimpleRateThrottle
    class RateThrottle(SimpleRateThrottle):
        scope = "visit_rate"
    
        def get_cache_key(self, request, view):
            return self.get_ident(request)

      另外,我们需要在全局配置频率控制参数:

    REST_FRAMEWORK = {
        "DEFAULT_THROTTLE_CLASSES": ('ap.utils.throttles.RateThrottle',),
        "DEFAULT_THROTTLE_RATES": {
            "visit_rate": "5/m"
        }
    }

      这样就实现了,每分钟最多五次访问.

    二、url注册器

      通过DRF的视图组件,数据接口逻辑被我们优化到最后剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下:

    from django.urls import re_path, include
    # 1.导入模块 from rest_framework import routers from serializer import views # 2.实例化一个router对象 router = routers.DefaultRouter()
    # 3.将需要自动生成url的接口注册到router中 router.register('books', views.BookView)
    # 4.生成url urlpatterns = [ re_path('^', include(router.urls)) ]

    三、响应器

      之前我们使用DRF的Response类来将数据响应给客户端,不管是POSTMAN还是浏览器,都能浏览到经过格式化后的漂亮的数据,DRF是怎么做的呢?其实就是通过响应器组件。

      如果我们不需要使用DRF提供给浏览器的格式化后的数据,只需要禁止该响应方式即可:

    from rest_framework.renderers import JSONRenderer
    
    class BookView(ModelViewSet):
        
        renderer_classes = [JSONRenderer]
        
        queryset = Book.objects.all()
        serializer_class = BookSerializer

      这样,浏览器再次访问,接收到的就是普通的json格式数据,而不是经过DRF格式化后的数据,renderer_classes的查找逻辑与之前的解析器等组件是完全一样的。

    四、分页器

      为了服务器性能考虑,也为了用户体验,我们不应该一次将所有的数据从数据库中查询出来,返回给客户端浏览器,如果数据量非常大,这对于服务器来讲,可以说是性能灾难,而对于用户来讲,加载速度将会非常慢。

      所以,我们需要控制每次返回给客户端多少数据,这就需要用到分页器。

    1、接下来,介绍一下DRF的局部实现分页器组件

    # 1.导入模块
    from rest_framework.pagination import PageNumberPagination
    
    # 自定义分页器类,继承PageNumberPagination
    class MyPagination(PageNumberPagination):
        page_size = 3
        page_query_param = 'p'
        page_size_query_param = 'size'
        max_page_size = 5
    
    
    class BookView(APIView):
    
        def get(self, request):
            # 2.获取数据
            queryset = Book.objects.all()
            # 3.创建分页器对象
            paginater = MyPagination()
            # 4.开始分页
            paged_books = paginater.paginate_queryset(queryset, request)
            # 5.将分页后的数据进行序列化
            serializer_books = BookSerializer(paged_books, many=True)
            # 6.返回数据
            return Response(serializer_books.data)

    2、参数介绍

    page_size:用来控制每页显示多少条数据(全局参数名为PAGE_SIZE);
    page_query_param:用来提供直接访问某页的数据;
    page_size_query_param:临时调整当前显示多少条数据;
    max_page_size:控制page_size_query_param参数能调整的最大条数;

    3、ModelViewSet中使用分页器

    from rest_framework.viewsets import ModelViewSet
    from rest_framework.pagination import PageNumberPagination
    
    # 自定义分页器类
    class MyPagination(PageNumberPagination):
        page_size = 3
        page_query_param = 'p'
        page_size_query_param = 'size'
        max_page_size = 5
    
    
    class BookView(ModelViewSet):
        
        pagination_class = MyPagination      # 指定分页器类
    
        queryset = Book.objects.all()
        serializer_class = BookSerializer

    4、分页器全局配置

    REST_FRAMEWORK = {
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 10  # 每页数目
    }

      

  • 相关阅读:
    【Beta阶段】第一次Scrum Meeting
    【Beta阶段】第二次Scrum Meeting
    【Beta阶段】第三次Scrum Meeting
    [BUAA软工]Alpha阶段事后分析
    [BUAA软工]Alpha阶段测试报告
    [北航软工]团队贡献分规则
    Windows Server 2008 R2之二从介质安装 AD DS
    Windows Server 2008 R2之一活动目录服务部署
    DC84问
    获取命令行指定参数
  • 原文地址:https://www.cnblogs.com/li-li/p/10103918.html
Copyright © 2011-2022 走看看