• rest_framwork之认证组件,权限组件,频率组件


    1 认证组件
    2 权限组件
    3 频率组件


    1 认证组件
     (1) 定义一个认证类
       class UserAuth():
         def authenticate_header(self,reuqest):
           pass
         def authenticate(self,reuqest):
           user_token = request.query_params.get("token")
            try:
                token = UserToken.objects.get(token=user_token)
                # 后面权限会用到
                return token.user, token.token
            except Exception:
                raise APIException("没有认证")
                
                
    (2) 在需要认证的数据接口里面指定认证类
     class BookView(ModelViewSet):
       authentication_classes=[UserAuth]
       queryset=Book.object.all()
       serializer_class=BookSerializer
       
       
       
    2 权限组件
     (1)定义一个权限类
       class UserPerm():
         def has_permission(self,reuqest,view):
           return None
      (2)指定权限验证类
       class BookView(APIView):
         authentication_classes=[UserAuth]
         permission_class=[UserPerm]
        
         queryset=Book.objects.all()
         serialize_class=BookSerializer
        

    3 频率组件

    (1) 定义一个频率组件
    class RateThrottle():
      def allow_request(request,self):
          if 没有超过限制:
                return True
          else:
               return False

      def wait(self):
            return 10
            
            
    (2)指定频率类
    class BookView(APIView):
      throttle_classes=[RateThrottle]
     


    使用简单的频率控制来控制访问频率(全局)
    (1)导入模块
     from rest_framework.throttling import SimpleRateThrottle

    (2)定义一个类并继承SimpleRateThrottle
        class RateThrottle(SimpleRateThrottle):
                # 指定访问频率
                scope = 'visit_rate'
                
                # 指定通过什么方式来区分用户
                def get_cache_key(self, request, view):
                    return self.get_ident(request)

    (3)在setting里面指定频率类和访问频率
        REST_FRAMEWORK = {
                            "DEFAULT_THROTTLE_CLASSES": ('serializer.utils.app_throttles.RateThrottle',),
                            "DEFAULT_THROTTLE_RATES": {
                                "visit_rate": "5/m"
                            }
                        }

                        

    4 url 注册器
    (1)导入
        from django.urls import re_path,include
        from .serializer import views
        from rest_framework import routers
        
     (2)生成一个注册器实例对象
       router = routers.DefaultRouter()
       
     (3)将自动生成的url注册
      router.register(r"books", views.BookView)
     
     (4)开始自动生成url
      urlpatterns=[
       re_path('^', include(router.urls)),  
      ]
     
     
     
    (5)响应器组件
    (1)导入
      from rest_framework.renderers import JsonRender

     
     (2) 指定返回类
      class BookView(APIView):
        render_classes=[JsonRender]
        
        
    (6)分页器组件
      (1) 导入
        from rest_framework.pagination import PageNumberPerination
        
     (2)获取数据
       books=Book.object.all()
     
      (3)创建一个分页器对象
       paginater=PageNumberPerination()
     
      (4) 开始分页
        paged_books = paginater.paginate_queryset(books, request)
        
      (5) 开始序列化
       serialized_books = BookSerializer(paged_books, many=True)
       
    - 返回数据
            return Response(serialized_books.data)
        
        
    (7)分页器组件局部实现
        - 导入模块
            from rest_framework.pagination import PageNumberPagination

        - 自定义一个分页类继承PageNumberPagination
            class MyPagination(PageNumberPagination):
                page_size = 2
                page_query_param = 'p'
                page_size_query_param = 'size'
                max_page_size = 5

        - 实例化一个分页类对象
            paginater = MyPagination()

        - 开始分页
            paged_books = paginater.paginate_queryset(books, request)

        - 开始序列化
            serialized_books = BookSerializer(paged_books, many=True)

        - 返回数据
            return Response(serialized_books.data)

  • 相关阅读:
    如何在myeclipse上使用git(码云)
    myeclipse使用git图文教程
    内存buffer转换为多维数组访问
    fd究竟是何方神圣
    getline c实现
    TLB初始化 Missing Handler,MIPS R3K mips_init_tlb
    Ubuntu 16.04 风扇特别响解决办法
    MySQL安装与卸载
    linux项目环境部署入门
    MySQL入门笔记一
  • 原文地址:https://www.cnblogs.com/mlhz/p/10121873.html
Copyright © 2020-2023  润新知