django-rest_framework组件

序列化组件


-Serializer

    from rest_framework import serializer
    
    class BookSerializers(serializers.Serializer):
        title=serializers.CharField(max_length=32)
        
        
        authors=serializers.SerializerMethodField()
        def get_authors(self, obj):    #自定制显示字段内容 obj为book对象
            author = obj.authors.get()
            return author

-ModelSerializer

    from rest_framework import ModelSerializer
    
    class BookSerializers(serializers.ModelSerializer):
        class Meta:
            model = models.Book     
            fields = "__all__"    #指定字段
                        #  exclude=('nid',)  排除字段  不能跟fields同时用
            depth = 1     #数据深度
        
        def validate_title(self, value):  #局部校验钩子
            from rest_framework import exceptions
            raise exceptions.ValidationError('局部错误')
            return value
        
        def validate(self, attrs):     #全局钩子
            if attrs.get('title')== attrs.get('title2'):
                return attrs
            else:
                raise exceptions.ValidationError('全局')    

 

  #ModelSerializer方法
  queryset.is_valid() #校验数据
  queryset.save() #保存在数据库

 

-HyperlinkedModelSerializer

class ArticleHyperlinkedSerializer(serializers.HyperlinkedModelSerializer):
    source = serializers.HyperlinkedIdentityField(view_name='source-detail', lookup_field='source_id', lookup_url_kwarg='pk')
    #view_name指向视图名   lookup_field      lookup_url_kwarg
    class Meta:
        model = models.Article
        fields = ["id", "type", "title", "source"]
        depth = 1

#路由

urlpatterns = [
    url(r'source/(?P<pk>\d+)', views.SourceDetailView.as_view(), name='source-detail'),    #视图别名name
]


#视图

ser_obj = ArticleHyperlinkedSerializer(article_list, many=True, context={'request': request})  #context固定写法

 

 

视图组件ModelViewSet ViewSetMixin

#路由
    url(r'^publish/$', views.PublishView.as_view({'get':'list','post':'create'})),
    url(r'^publish/(?P<pk>\d+)/$', views.PublishView.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
#视图
    from rest_framework.viewsets import ModelViewSet
    
    class PublishView(ModelViewSet):
        queryset=models.Publish.objects.all()   
        serializer_class=PublishSerializers
        HyperlinkedModelSerializer

 

认证组件

 from rest_framework.authentication import BaseAuthentication
    
    class TokenAuth(BaseAuthentication):
        def authenticate(self, request):
            username = request.GET.get('username')
            token = request.GET.get('token')
            token_obj = models.UserToken.objects.filter(token=token).first()
            if token_obj:
                return username,token
            else:
                raise AuthenticationFailed('认证失败')
        
        def authenticate_header(self,request):
            pass
        
    
    #局部配置
    class cla(APIView):
        authentication_classes = [TokenAuth, ]
    
    #全局配置
    #setting文件中
        REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",]
        }

权限组件:

    from rest_framework.permissions import BasePermission
    class UserPermission(BasePermission):
        def has_permission(self, request, view):
        user_type = request.user.user_type
        if user_type == 1:
            return True
        else:
            return False
            
    
    #局部配置
    class cla(APIView):
        permission_classes  = [UserPermission, ]
    
    #全局配置
    #setting文件中
        REST_FRAMEWORK={
        "DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
        }

频率组件

 

    from rest_framework.throttling import SimpleRateThrottle
    class VisitThrottle(SimpleRateThrottle):
        scope = 'luffy'
        def get_cache_key(self, request, view):
            return self.get_ident(request)
            
            
    #局部配置
    class cla(APIView):
        throttle_classes = [MyThrottles,]
    
    #全局配置
    #setting文件中
        REST_FRAMEWORK={
        'DEFAULT_THROTTLE_CLASSES':['app01.utils.VisitThrottle',],
        "DEFAULT_THROTTLE_RATES":{'luffy':'3/m'}
        }

 

分页器

    #简单分页器
        from rest_framework.pagination import PageNumberPagination
        
        class Mypage(PageNumberPagination):
            page_size = 2
            page_query_param = 'page'
            # 定制传参
            page_size_query_param = 'size'
            # 最大一页的数据
            max_page_size = 5
            
        class  Pager(APIView):
            def get(self,request,*args,**kwargs):
                # 获取所有数据
                ret=models.Book.objects.all()
                # 创建分页对象
                page=Mypage()
                # 在数据库中获取分页的数据
                page_list=page.paginate_queryset(ret,request,view=self)
                # 对分页进行序列化
                ser=BookSerializer1(instance=page_list,many=True)
                # return Response(ser.data)
                # 这个也是返回Response对象,但是比基本的多了上一页,下一页,和总数据条数(了解即可)
                return page.get_paginated_response(ser.data)
            
        #配置
        
            REST_FRAMEWORK = {
                # 每页显示两条
                'PAGE_SIZE':2
            }
    
    #偏移分页
        from rest_framework.pagination import LimitOffsetPagination
        # 也可以自定制,同简单分页
        class  Pager(APIView):
            def get(self,request,*args,**kwargs):
                # 获取所有数据
                ret=models.Book.objects.all()
                # 创建分页对象
                page=LimitOffsetPagination()
                # 在数据库中获取分页的数据
                page_list=page.paginate_queryset(ret,request,view=self)
                # 对分页进行序列化
                ser=BookSerializer1(instance=page_list,many=True)
                # return page.get_paginated_response(ser.data)
                return Response(ser.data)

解析器/响应器

    #解析器 限制允许接收的数据格式
    
        #全局配置:
            REST_FRAMEWORK = {
            'DEFAULT_PARSER_CLASSES':[
                'rest_framework.parsers.JSONParser'    json格式
                'rest_framework.parsers.FormParser'        urlencoded 格式
                'rest_framework.parsers.MultiPartParser'    form-data格式
                ]

            }
        
        #局部使用
        class cla(APIView):
            parser_classes = [JSONParser, ]

-响应器
http://127.0.0.1:8000/test/?format=json
http://127.0.0.1:8000/test.json
http://127.0.0.1:8000/test/

 

版本控制

    from rest_framework.versioning import QueryParameterVersioning,
    AcceptHeaderVersioning,
    NamespaceVersioning,
    URLPathVersioning
    
    #基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1
    #*****基于url的正则方式:URLPathVersioning------>/v1/users/
    
    
    
    #局部使用
    versioning_class = URLPathVersioning
    
    #全局使用
    REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',    #选择哪个版本控制组件
    'DEFAULT_VERSION': 'v1',             #默认版本(从request对象里取不到,显示的默认值)
    'ALLOWED_VERSIONS': ['v1', 'v2'],    #允许的版本
    'VERSION_PARAM': 'version'           #URL中获取值的key
    }

 

posted @ 2019-04-12 10:38  SwZ1886  阅读(124)  评论(0编辑  收藏  举报