django resetful framework

8346 단어 Django
  • Django rest framework(1)--------인증
  • Django rest framework(2)------권한
  • Django rest framework(3)---- 절전
  • Django rest framework(4)---- 버전
  • Django rest framework(5)----해석기
  • Django rest framework(6)----서열화
  • Django rest framework(7)----페이지 나누기
  •  
    서열화
    queryset에 대한 서열화는 일반적으로 두 종류의serializers를 계승한다.Seriailzer와 Serializers.ModelSerializer 
    models.py
    from django.db import models
    
    # Create your models here.
    
    class Article(models.Model):
        title = models.CharField(max_length=32,unique=True, null=False)
        desc = models.TextField()
        create_time = models.DateTimeField(auto_now_add=True)
        is_show = models.BooleanField(default=1)
        author=models.ForeignKey(to='UserInfo',on_delete=models.CASCADE,default=1)
    
        class Meta:
            db_table = 'article'
    
    
    
    class UserInfo(models.Model):
        USER_TYPE = (
            (1,'    '),
            (2,'VIP'),
            (3,'SVIP')
        )
    
        user_type = models.IntegerField(choices=USER_TYPE)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=64)
    
    class UserToken(models.Model):
        user = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
        token = models.CharField(max_length=64)

     
    serializers.py
    #   *****     
    # Serializer             
    # ModelSerializer     Meta  fields = ‘__all__’       
    #                         
    #                      ModelSelrialzer      depth=1
      class Meta:
        fields='__all__'
        model = 'xxxxx'
        depth = 1                2             
    #                             
    # 1                        def get_  (self,obj) -->obj      
    # 2    to_representation    super().to_representation                
    #                       
    #   ******      
    #                     Django Form  
    
    from rest_framework import serializers
    
    from app1.models import Article, UserInfo
    
    class UserSerializer(serializers.Serializer):
        #username=serializers.CharField(source='username')            
        username=serializers.CharField() 
        password=serializers.CharField()
        user_type=serializers.CharField()
        article=serializers.SerializerMethodField()
        #    article                           int      
        #             
        def get_article(self,obj):
            res=obj.article_set.all()
            serializer=ArticleSerializer(instance=res,many=True)
            return serializer.data
    
    
    class User2Serializer(serializers.ModelSerializer):
        class Meta:
            model = UserInfo
            fields='__all__'
    
    class ArticleSerializer(serializers.ModelSerializer):
    
        # author=serializers.SerializerMethodField()
        class Meta:
            model = Article
            fields="__all__"
    
        # def get_author(self,obj):
        #     # data=UserSerializer(instance=obj.author,many=False).data #                         
       #                  --          
        #     res=User2Serializer(obj.author).data
        #     return res
        #                  instance            
        def to_representation(self, instance):
            data=super().to_representation(instance)
            data['author']=User2Serializer(instance=instance.author,many=False).data
    
            return data
    
    class UserTokenSerializer(serializers.Serializer):
        token=serializers.CharField()
        username=serializers.CharField(source='user.username') #            

    인증
      、    
               
        class XXX(APIView):
            authentication_classes=[      ]
            pass
        
                BasicAuthentication
          
        from rest_framework.authentication import BaseAuthentication
        from rest_framework import exception
        class UserAuth(BaseAuthentication):
            #           
            def authenticate(self,request):
                token=request.query_params.get('id')
                #         --     
                if not token:
                    raise exception.AuthenticationFailed({'code':900,'msg':‘    ’})
                #                user    token
                user_obj=        
                return user_obj,token  ----     request.user=user_obj (  )  
            def authenticate_header(self, request):
                pass
        
    
      、    
    settings   
    
    REST_FRAMEWORK={
        'DEFAULT_AUTHENTICATION_CLASSES':(             views ,) --              
    }
    

    사용 권한
    인증과 차이가 많지 않지만 사용 권한의 전제는 인증을 사용해야 한다는 것을 생각해 보면 알 수 있습니다("Authentication credentials were not provided.")
     、      
        class XXX(APIView):
            permission_classes
        
             BasicPermission
        from rest_framework.permissions import BasePermission
        from rest_framework import exceptions
                exceptions.PermissionDenied 
        class UserPermission(BasePermission):
              #                
              def has_permission(self,request,view):
                          
                     
                    return True #    
                    return False #   
                
            
            
    
    
    
     、      
    
     settings   
    
    REST_FRAMEWORK={
        'DEFAULT_PERMISSION_CLASSES':(             views ,) --              
    }
    
    

    지출을 절약하다
    첫 번째 쓰기 상속BaseThrottle
    from rest_framework.throttling import BaseThrottle
    
    vist_data = {}
    
    #       (       )
    class VisitThrottle(BaseThrottle):
        '''    60s      (  ip)''
        history = None
        def allow_request(self, request, view):
    
            cur_time = time.time()
            identify = self.get_ident(request)
            if identify not in vist_data:
                vist_data[identify] = []
                vist_data[identify].append(cur_time)
                return True
            res = vist_data[identify]
            self.history = res
            if res:
                if res[-1] + 60 > cur_time:
                    if len(res) < 3:
                        res.insert(0, cur_time)
                        return True
                    return False
                else:
                    res.pop()
                    return True
            else:
                res.append(cur_time)
                return True
    
        #                  
        def wait(self):
            
            return 60 - (time.time() - self.history[-1])

    두 번째 계승 SimpleRateThrottle
    class VisitThrottle(SimpleRateThrottle):
    #
    #      #                  scope   get_cache_key        
        
          scope = 'NBA' #   BaseThrottle     scope
    #
    #    
    #     def get_cache_key(self, request, view):
    #         #   ip    
    #         return self.get_ident(request)
    
    
    

    settgins.py
    'DEFAULT_THROTTLE_CLASSES': ('utils.throttle.VisitThrottle',),
    #   SimpleRateThrottle        
    "DEFAULT_THROTTLE_RATES":{
                'NBA':'5/m',         #     3/m,NBA  scope    
                'NBAUser':'3/m',    #    10/m,NBAUser  scope    
                # NBA  NBAUser        APIView          
            }

     
    페이지 나누기
    제1식
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #      
            roles = models.Role.objects.all()
            #      
            pg = PageNumberPagination()
            #       
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #        
            ser = PagerSerialiser(instance=page_roles,many=True)
            return Response(ser.data)

    settings.py는 반드시 페이지 나누기를 설정해야 합니다. 그렇지 않으면 []
    REST_FRAMEWORK={
        "PAGE_SIZE":2  #     
    }

    두 번째 방식은 페이지 클래스 계승을 사용자 정의합니다
    #      
    class MyPageNumberPagination(PageNumberPagination):
        #       
        page_size = 3
        #      3 ,      pager1/?page=2&size=4,           
        page_size_query_param = "size"
        #       10
        max_page_size = 10
        #      
        page_query_param = "page"
    
    
    class Pager1View(APIView):
        def get(self,request,*args,**kwargs):
            #      
            roles = models.Role.objects.all()
            #      ,       MyPageNumberPagination
            pg = MyPageNumberPagination()
            #       
            page_roles = pg.paginate_queryset(queryset=roles,request=request,view=self)
            #        
            ser = PagerSerialiser(instance=page_roles,many=True)
            return Response(ser.data)

     
    텍스트 링크http://www.cnblogs.com/derek1184405959/p/8727595.html
     
     
     
     

    좋은 웹페이지 즐겨찾기