zoukankan      html  css  js  c++  java
  • DRF(django-rest_framework)框架

    
    

    drf执行流程,APIView,Request

      -继承APIView(继承自view),重写了dispatch方法
      -dispatch方法:1 request对象,被重新封装了,成了新的request 这个方法做的事:self.initialize_request(request, *args, **kwargs)
      -self.initial(request, *args, **kwargs)
      -认证,权限,频率
      -request.POST/method.... 重写了__getattr__方法 (所有封装后的request.GET等价于django view的request)

      

    5个视图类
    补充序列化 json模块
      query_set=models.User.objects.all().values('name')
      #query_set是query对象,不能直接序列化
      json.dumps(list(query_set),ensure_ascii=Fales) //先转换成列表,才能序列化,ascii等于False 不显示ascii字符
    (django自带序列化 from django.core import serializers)
    drf序列化
      serializers
     
     source 如果是字段,会显示字段,如果是方法,会执行方法,不用加括号(authors=serializers.CharField(source='authors.all')) #获取authors跨表的所有对象
      Modelserializers
        
    class BookSerializers(serializers.ModelSerializer):
        class Meta:
            model = models.Book
            # fields = "__all__"
            fields=['nid','title','authors','publish']  #需要显示的字段,都必须添加到field是中
            # exclude=('nid',)   #不能跟fields同时用
            # depth = 1    #深度控制,写 几 往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层
        publish=serializers.SerializerMethodField()
        def get_publish(self,obj):
            return obj.publish.name
        authors=serializers.SerializerMethodField()
        def get_authors(self,obj):
            ret=obj.authors.all()
            ss=AuthorSerializer(ret,many=True)
            return ss.data
    
    
    

    restframework规范10条:
      --1.表示资源,路由用名词表示
      --2.携带请求方法 如get post
      --3.携带api ex:www.baid/api
      --4.返回值带有状态码 以json格式
      --5.过滤条件 在路由上携带参数
      --6 错误处理,应返回错误信息,error当做key
      --7 返回结果针对不同操作,返回数据格式要求  
      --8 返回结果中提供链接,访问具体详细
      --9 API与用户通信,总是使用https协议
      --10 把版本号放在请求头中(即url)

    认证组件

      -drf源码中找,认证是如何实现的
        -APIView的dispach方法---》self.initial(request, *args, **kwargs)----》400行self.perform_authentication(request)
        ---》APIView的perform_authentication(request)----》request.user(request是新的request)
        ---->去Request类中找user,执行--->self._authenticate()(self是新的reqeust对象)---->Request类的_authenticate(self)方法,深度
          -使用认证功能
            -写一个类,MyAuthetication
            -写两个方法,一个是authenticate,一个是authenticate_header
            -在authenticate方法中写认证逻辑,认证通过,返回空,认证不通过,抛异常

     

      -最终的认证使用(按照这个来)******重点*******
      -局部使用
        -在视图类中配置:authentication_classes=[MyAuthetication]
      -全局使用
        -在setting中配置:
        REST_FRAMEWORK={
        'DEFAULT_AUTHENTICATION_CLASSES':['app01.MyAuth.MyAuthetication',]
        }
      -全局使用了,局部禁用:
        -在视图类中配置:authentication_classes=[] #查找顺序先是局部(视图),none的话去全局settings中

    
    

      权限组件
        比如只有超级用户能访问books/这个接口
        -使用:
        -写一个权限类
         from rest_framework.permissions import BasePermission
         class MyPermissions(BasePermission):
          def has_permission(self,request,view): #方法固定格式
          #代表是超级用户
          if request.user.type ==1:
          #如何去除type对应的文字 get_字段名_display()
          user_str=request.user.get_type_display()
          print(user_str)
          #超级用户,校验通过,返回true,校验失败,返回false
          return True
          else:
            return False
          -源码分析
          APIView中的:check_permissions(self, request),进行的权限校验
          -配置错误信息的显示
          message='错误提示'
      频率组件
        同一时间段内,只能访问多少次
        频率的使用:
        -写一个类:
          from rest_framework.throttling import SimpleRateThrottle
          class MyThrottling(SimpleRateThrottle):
          scope='xxx'
          #必须重写get_cache_key,返回什么,频率组件会以什么做限制(比如返回ip,它就以ip做限制,如果返回user_id,它会以用户id做限制)
          def get_cache_key(self, request, view):
            return request.META.get('REMOTE_ADDR')
          -在setting中配置:
          'DEFAULT_THROTTLE_RATES': {
          'xxx': '10/day'
          }


    from django.shortcuts import render # Create your views here. from rest_framework import serializers from rest_framework.views import APIView from rest_framework.exceptions import ValidationError from rest_framework.response import Response from rest import models class SourceSerializer(serializers.Serializer): name = serializers.CharField()#获取字段数据后进行序列化 def validate_name(self, value): #添加的验证规则 类似 if '' in value: raise ValidationError('不符合社会主义核心价值观') return value class SourceModel(serializers.ModelSerializer): group = serializers.CharField(source='group.num') #获取字段中不可见的内容source='get_字段_display', 比如choices中的文字 #跨表通过fk.属性名(group.num) 赋值给字段名group class Meta: #指定表 model = models.User fields = "__all__" depth = 1#跨表深度(跨越一张表) from django.http import JsonResponse from django.views import View class SourceView(APIView): def get(self, request, *args, **kwargs): res = {"code": 0} all_source = models.User.objects.all() ser_obj = SourceModel(all_source, many=True)#多个字段序列需要加param:many=True print(ser_obj.data)#获取序列化后的数据 res["data"] = ser_obj.data return JsonResponse(res)#rest_framework中的Response 需要注册app: rest_framework 因为要条用其中api.html
    from rest_framework import serializers
    from rest_framework.views import APIView
    from rest_framework.exceptions import ValidationError
    from rest_framework.response import Response
    from rest_work import models
    
    
    class GroupSerializer(serializers.Serializer):
    
        title = serializers.CharField()#获取字段数据后进行序列化
    
    
    
        def validate_title(self, value):  #添加的验证规则 类似
            #必须先序列化,在进行验证
            if '' in value:
                raise ValidationError('不符合社会主义核心价值观')
            return value
    
        def update(self, instance, validated_data):
            instance.name = validated_data['title']
            instance.save()
    
        def create(self, validated_data):
            return models.Group.objects.create(**validated_data)
    
    
    class SourceSerializer(serializers.Serializer):
    
        name = serializers.CharField()#获取字段数据后进行序列化
        age = serializers.CharField()
        # group = serializers.CharField(write_only=True)
        group = serializers.SerializerMethodField()
    
    
        def validate_name(self, value):  #添加的验证规则 类似
            #必须先序列化,在进行验证
            if '' in value:
                raise ValidationError('不符合社会主义核心价值观')
            return value
    
        def validate_group(self, value):     #注意继承serializer.Serializer,create(), update(),需要自己重写,关于外键的更新。创建,需要传入fk对应表的instance实例对象print(value)         #我通过验证返回了一个,没法然会报错。 所以个人推荐用Modelserializer
            return models.User.objects.filter(group=value).first().group
    
        def update(self, instance, validated_data):
            instance.name = validated_data['name']
            instance.email = validated_data['age']
            instance.save()
    
        def create(self, validated_data):
            # print(self.context['group'])
            print(validated_data)
            return models.User.objects.create(**validated_data)
    
    
    class SourceModel(serializers.ModelSerializer):
        class Meta: #指定表
            model = models.User
            fields = "__all__"  #自定义显示字段,额外的字段也必须添加到列表中
    
    from django.http import JsonResponse
    from django.views import View
    class SourceView(APIView):
    
        def get(self, request, *args, **kwargs):
            res = {"code": 0}
            all_source = models.User.objects.all()
            ser_obj = SourceSerializer(all_source, many=True)#多个字段序列需要加param:many=True
            print(ser_obj.data)#获取序列化后的数据
            res["data"] = ser_obj.data
            return Response(res)
    
    #from rest_framework.utils.serializer_helpers import ReturnList
        def post(self,  *args, **kwargs):
            res = {"code": 0}
            # all_source = models.User.objects.all()
            #ser_obj = SourceSerializer(all_source, many=True)#多个字段序列需要加param:many=True
            # print(self.request.data)
            ser_obj = SourceModel(data=self.request.data)
            if ser_obj.is_valid():
                # print(ser_obj.data)
                ser_obj.save()
                res['data'] = ser_obj.data
            else:res['code'] = 1
            #获取序列化后的数据
            res["data"] = ser_obj.errors
            return Response(res)

    详细链接地址:https://blog.csdn.net/l_vip/article/details/79156113

  • 相关阅读:
    点聚weboffice插件自定义菜单
    Delphi程序带参数运行
    64位系统下注册32位dll文件
    64位进程调用32位dll的解决方法
    memcached启动脚本以及telnet测试
    LSM树由来、设计思想以及应用到HBase的索引
    B树(B-Tree)的由来、数据结构、基本操作以及数据库索引的应用
    java读取utf8配置文件乱码
    设置某个ip对mysql服务器有权限,以及mysql定时备份
    《HBase实战》
  • 原文地址:https://www.cnblogs.com/qlshao/p/10250766.html
Copyright © 2011-2022 走看看