zoukankan      html  css  js  c++  java
  • Django---子框架drf内容总结

    1 restful规范--10条

    2 django上写符合restful规范的接口

    3 drf写接口

    4 APIView--》继承了原生View---》get,post方法

    -(为什么get请求来了,就会执行get方法:原生View的dispatch控制的)
    -路由配置:视图类.as_view()---->view(闭包函数)的内存地址
    -请求来了,就会执行view(requst,分组分出的字段,默认传的字段)---》self.dispatch()-->处理的
    
    -APIView重写了dispatch:包装了request对象,解析器,分页,三大认证,响应器,全局异常,去掉了csrf
    

    5 Request对象:request.request,request.data,重写了__getattr_,request.method-->去原生request中拿

    -前端传过来的数据从那取?
    	-地址栏里:request.GET/query_params
       	-请求体中的数据:request.data/POST(json格式解释不了)---》request.body中取
        -请求头中数据:request.META.get("HTTP_变成大写")
    

    6 Response对象---》封装了原生的HttpResponse,Response(data,headers={},status=1/2/3/4/5开头的)

    7 自己封装了Response对象

    8 序列化类:

    -Serializer
    	-写字段,字段名要跟表的字段对应,想不对应(source可以修改),有属性,read_only,max_len...
        -SerializerMethodField必须配套一个get_字段名,返回什么,前台就看到什么
    -ModelSerializer
    	-class Meta:
        	表对应
            取出的字段(__all__,列表)
            排除的字段(用的很少)
            extra_kwargs会给字段的属性
            
        -重写某个字段
        	password=serializers.SerializerMethodField()
            def get_password(self,instance):
                return "***"
        -校验:字段自己的校验,局部钩子,全局钩子
        	-只要序列化类的对象执行了is_valiad(),这些钩子都会走,可以再钩子里写逻辑
        -在表模型(model)中写方法,可以在上面取出的字段中直接写,不参与反序列化
    

    -序列化多条(many=True):本质,ListSerializer内部套了一个个的serializer对象
    -重写ListSerializer,让序列化对象和自己写的ListSerializer对应上(了解)
    -序列化类(instance,data,many,context={requtst:request})
    -视图函数中给序列化对象传递数据,使用context,传回来,放进去直接使用序列化对象.context.get()

    9 视图

    -两个视图基类 APIView,GenericAPIView(继承APIView):涉及到数据库和序列化类的操作,尽量用GenericAPIView
    -5个视图扩展类(父类都是object)
        CreateModelMixin:create
        DestroyModelMixin:destory
        ListModelMixin
        RetrieveModelMixin
        UpdateModelMixin
    -9个视图子类(GenericAPIView+上面5个视图扩展类中的一个或多个)
    	RetrieveUpdateDestroyAPIView
        CreateAPIView
        RetrieveAPIView
        DestroyAPIView
        RetrieveUpdateAPIView
        ListCreateAPIView
        UpdateAPIView
        ListAPIView
        RetrieveDestroyAPIView
    -视图集
    	-ModelViewSet:5大接口都有了
        -ReadOnlyModelViewSet:获取一条和获取多条的接口
    	-GenericViewSet:ViewSetMixin+GenericAPIView        
        ViewSet:ViewSetMixin+APIView
        ViewSetMixin:类重写了as_view,路由配置就变样了
    

    10 路由

    -基本配置:跟之前一样
    -有action的:必须继承ViewSetMixin
    -自动生成:DefaultRouter和SimpleRouter
    	-导入,实例化得到对象,注册多个,对象.urls(自动生成的路由)
        -路由相加urlpatterns+=router.urls/include:path('', include(router.urls))
    -视图类中自己定义的方法,如何自动生成路由
    	-在自己定义的方法上加装饰器(action)
        -两个参数methods=[GET,POST],表示这两种请求都能接受
        -两个参数detail=True,表示生成带pk的连接
    

    11 三大认证

    -认证组件:校验用户是否登录
    	-写一个认证类,继承BaseAuthentication,重写authenticate,内部写认证逻辑,认证通过返回两个值,第一个是user,认证失败,抛去异常
        -全局使用,局部使用,局部禁用
    -权限:校验用户是否有权限进行后续操作
    	-写一个类,继承BasePermission,重写has_permission,True和False
        -全局使用,局部使用,局部禁用
    -频率:限制用户访问频次
    	-写一个类,继承SimpleRateThrottle,重写get_cache_key,返回什么,就以谁做限制,scop=luffy字段,需要跟setting中的key对应   luffy:3/h(一小时访问三次)
        
        -全局配置,局部配置,局部禁用
        -需求:发送短信验证码的接口,一分钟只能发送一次,局部使用,配在视图类上
    

    12 解析器:前端传的编码格式,能不能解析(默认三种全配了,基本不需要改),可能你写了个上传文件接口,局部配置一下,只能传form-data格式 局部使用:MultiPartParser

    13 响应器:响应的数据,是json格式还是带浏览器的那种(不需要配)

    14 过滤器:借助于第三方django-filter

    -注册应用
    -setting中配置DjangoFilterBackend或者局部配置
    -filter_fields = ('age', 'sex')
    

    15 排序

    -全局或者局部配置rest_framework.filters.OrderingFilter
    -视图类中配置: ordering_fields = ('id', 'age')
    

    16 分页

    -使用:
        继承了APIView的视图类中使用
        	 page=Mypage()
            # 在数据库中获取分页的数据
            page_list=page.paginate_queryset(queryset对象,request,view=self)
            # 对分页进行序列化
            ser=BookSerializer1(instance=page_list,many=True)
            # return Response(ser.data)
        继承了视图子类的视图中使用
        	 pagination_class = PageNumberPagination(配置成自己重写的,可以修改字段)
    -CursorPagination
        cursor_query_param:默认查询字段,不需要修改
        page_size:每页数目
        ordering:按什么排序,需要指定
    -LimitOffsetPagination
    	default_limit 默认限制,默认值与PAGE_SIZE设置一直
        limit_query_param limit参数名,默认’limit’
        offset_query_param offset参数名,默认’offset’
        max_limit 最大limit限制,默认None
    -PageNumberPagination:最常用的,需要在setting中配置page_size,四个参数
        page_size 每页数目
        page_query_param 前端发送的页数关键字名,默认为”page”
        page_size_query_param 前端发送的每页数目关键字名,默认为None
        max_page_size 前端最多能设置的每页数量
    

    17 全局异常

    -写一个方法
    	def exception_handler(exc, context):
            # 走drf原来的异常,原理异常有一些处理
            response = drf_exception_handler(exc, context)
    		# 我们自己处理,drf没有处理,丢给django的异常
            if response is None:
                if isinstance(exc, DatabaseError):#处理了一下数据库错误
                    response = Response({'detail': '数据库错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
                else:#其他异常
                    response = Response({'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
    
    return response
    -配置文件中配置(以后所有drf的异常,都会走到这里)
    	REST_FRAMEWORK = {
            'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
        }
    

    -18 jwt
    -是什么json web token 新的认证方式
    -三段:头,荷载(用户信息),签名
    -使用:最简单方式(在路由中配置)
    -path('login/', obtain_jwt_token),
    -自定制:
    多方式登录,手动签发token(两个方法)
    -自定制基于jwt的认证类
    -取出token
    -调用jwt提供的解析出payload的方法(校验是否过期,是否合法,如果合法,返回荷载信息)
    -转成user对象
    -返回

    -19 RBAC:基于角色的权限控制(django默认的auth就是给你做了这个事),公司内部权限管理
    对外的权限管理就是用三大认证
    -用户表
    -用户组表
    -权限表
    -用户对用户组中间表
    -用户组对权限中间表
    -用户对权限中间表

  • 相关阅读:
    LeetCode(111) Minimum Depth of Binary Tree
    LeetCode(108) Convert Sorted Array to Binary Search Tree
    LeetCode(106) Construct Binary Tree from Inorder and Postorder Traversal
    LeetCode(105) Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode(99) Recover Binary Search Tree
    【Android】通过经纬度查询城市信息
    【Android】自定义View
    【OpenStack Cinder】Cinder安装时遇到的一些坑
    【积淀】半夜突然有点想法
    【Android】 HttpClient 发送REST请求
  • 原文地址:https://www.cnblogs.com/linqiaobao/p/13325414.html
Copyright © 2011-2022 走看看