zoukankan      html  css  js  c++  java
  • drf 大总结

    接口

    """
    1、什么是接口:url+请求参数+响应数据 | 接口文档
    
    2、接口规范:
    	url:https,api,资源(名词复数),v1,get|post表示操作资源的方式,?过滤条件
    	响应数据:status,msg,results|data,url资源数据
    """
    

    DRF入门

    """
    1、封装风格
    
    2、请求生命周期:走APIView的as_view => View的as_view调用APIView的dispatch => 分发给视图类的请求函数 => 响应
    
    3、请求模块:二次封装request
    
    4、解析模块:局部全局配置,form-data、urlencoding、json
    
    5、渲染模块:局部全局配置,html、json
    
    6、响应模块:Response(data, http_status, header)
    data={'detail': serializer_obj.errors} => http_status=4..|5..
    # 4,5开头字段状态码,前台axios请求响应会解析到catch分支
    axios({}).then().catch()
    
    7、二次封装Response:
    	i) 继承Response
    	ii) 自定义参数格式化成data,传给 super().__init__(data=data)
    	iii) 网络状态码、响应头等信息带给super().__init__()
    	
    8、异常模块:在请求生命周期中,分发请求任务执行时,被一个超大的try except包裹,一旦出现任何异常,都会交给exception_handler函数处理
    	自定义原因:系统只处理了部分,所以手动还需要处理;后期异常信息需要记录到日志文件
    	工作流程:先交给drf处理异常,如果有响应结果,代表drf已处理,如果是None,自己处理
    """
    

    序列化组件

    # 1)可以将model对象序列化成可以返回给前台的json数据
    # 2)可以校验前台传来的数据,完成model的增与改
    
    模型层
    class User(models.Model):
        name = models.CharField(max_length=16)
        
        # 自定义插拔序列化字段 - 完成连表深度查询
        @property
        def my_name(self):
            return self.name
    
    序列化层
    class UserListSerializer(serializers.ListSerializer):
        def update(self, instance, validated_data):
            for index, obj in enumerate(instance):
                self.child.update(obj, validated_data[index])
          	return instance
    
    class UserModelSerializer(serializers.ModelSerializer):
        # 自定义反序列化不入库字段 - 要在钩子函数校验后移除
        check_name = serializers.CharFiled(write_only=True)
        class Meta:
            model = User
            fields = ['name', 'my_name', 'check_name']
            extra_kwargs = {
                'my_name': {
                    'read_only': True
                }
            }
            # 群改
            list_serializer_class = UserListSerializer
        # 局部、全局钩子
        # create、update方法不需要重写,可以完成单增、群增、单改
    
    视图层
    class UserAPIView(APIView):
        def get(self, request, *args, **kwargs):
            # 先orm得到 user_query | user_obj
            
            # 在得到序列化对象
            user_ser = UserModelSerializer(user_query, many=True)
            user_ser = UserModelSerializer(user_query, many=False)
            
            # 返回序列化结果 user_ser.data
        def post(self, request, *args, **kwargs):
            # 数据给序列化类
            user_ser = UserModelSerializer(data=user_list, many=True)
            user_ser = UserModelSerializer(data=user_dic, many=False)
            # 校验数据
            user_ser.is_valid(raise_exception=True)
            # 数据库操作
            user_query|user_obj = user_ser.save()
            
        def patch(self, request, *args, **kwargs):
            # 根据主键或主键们确定要修改的 对象 或 对象们
            
            # 数据给序列化类
            user_ser = UserModelSerializer(data=user_list, many=True, instance=对象们, partial=True|False)
            user_ser = UserModelSerializer(data=user_dic, many=False, instance=对象, partial=True|False)
            # 校验数据
            user_ser.is_valid(raise_exception=True)
            # 数据库操作
            user_query|user_obj = user_ser.save()
    

    三大认证

    """
    1、认证组件:
    	i)自定义认证类继承BaseAuthentication,重写authenticate方法
    	ii)规则:游客返回None,非法用户抛异常,合法用户返回(user, auth)
    	iii)全局局部配置
    	
    2、权限组件:
    	i)自定义权限类继承BasePermission,重写has_permission方法
    	ii)规则:有权限返回True,无权限返回False - 校验对象:request.user或请求方式
    	iii)全局局部配置
    	
    3、评论组件:
    	i)自定义频率类继承SimpleRateThrottle,重写get_cache_key方法,设置scope类属性
    	ii)全局配置scope对应的访问频率:次数/时间
    	iii)get_cache_key返回的是与限制条件有关的动态字符串 - 限制条件来源于请求参数或请求头
    	iv)全局局部配置
    	
    4、jwt认证:
    	i)客户端存token,服务器存签发算法、校验算法、秘钥
    	ii)基本信息(头base64).用户信息过期时间(载荷base64).全信息+秘钥(签名HS256)
    	iii)drf-jwt组件使用
    	iv)登录接口签发token
    	v)认证组件校验token
    """
    

    群查过滤组件

    """
    1、搜索组件:search_fields = ['name', 'price']
    
    2、排序组件:ordering_fields = ['pk', 'price']
    
    3、分页组件:pagination_class = pagenations.MyPageNumberPagination
    
    4、django-filter过滤插件:filter_class = CarFilterSet
    
    5、自定义过滤器:自定义过滤类实现filter_queryset即可,根据筛选条件筛选后再返回queryset即可
    
    使用:
    i)视图类添加过滤类:filter_backends = [SearchFilter, OrderingFilter, LimitFilter, DjangoFilterBackend]
    ii)为不同的过滤类配置过滤条件
    """
    
  • 相关阅读:
    Python性能鸡汤
    postgreSQL设置自增长字段并插入值
    DBSCAN算法的Java,C++,Python实现
    查看进程及端口使用情况
    软件工程中的各种图
    程序员技术练级攻略[转]
    CSS中 opacity的设置影响了index(层数)的改变
    页面预加载loading动画
    JS 判断用户使用的设备类型
    图片懒加载——介绍
  • 原文地址:https://www.cnblogs.com/suwanbin-thought/p/11735785.html
Copyright © 2011-2022 走看看