码迷,mamicode.com
首页 > 其他好文 > 详细

drf jwt(总回顾)

时间:2021-07-01 16:52:50      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:instance   对象传递   view   patch   min   turn   ted   简单   use   

(#5题)技术图片 请求首行,请求头,请求体

# 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=
	状态码(restframework中有封装的)
{},status=1/2/3/4/5开头的)

#7  (重点)自己封装了Response对象
		(后面几乎是使用自己封装的  所以  是重点)
# 8 (最重点)序列化类:
	-Serializer
    	-写字段,字段名要跟表的字段对应(否则报错),想不对应(source可以修改),有属性,
        eg: id = serializers.CharField()
        read_only,max_len...writer_only
        -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})
    	-修改时有   其他只要传data即可( #修改才有instance,新增没有instance,只有data)
		-视图函数中给序列化对象传递数据,使用context,传回来,放进去直接使用序列化对象.context.get()(类似于两个的桥梁)
    	序列化是展示出来,反序列化是写入进去
    	序列化:就是quryset对象表模型(models)进行转换json格式
        反序列化:就是前端各种等传输json格式数据过来进行存储数据库前进行校验等都叫反序列化
# 9 视图
	-两个视图基类 APIView,GenericAPIView(继承APIView):涉及到数据库和序列化类的操作,尽量用GenericAPIView
    	-APIView多了一些属性和方法,比如:身份认证、权限检查、流量控制
    -5个视图扩展类(父类都是object)    GenericAPIView+这五个
        CreateModelMixin:create
        DestroyModelMixin:destory
        ListModelMixin:list
        RetrieveModelMixin:REtrieve
        UpdateModelMixin:update
    -9个视图子类(GenericAPIView+上面5个视图扩展类中的一个或多个 生成好的这9个(直接配置两个即可))
    	RetrieveUpdateDestroyAPIView
        CreateAPIView
        RetrieveAPIView
        DestroyAPIView
        RetrieveUpdateAPIView
        ListCreateAPIView
        UpdateAPIView
        ListAPIView
        RetrieveDestroyAPIView
    -视图集(都在views)(理清楚)
    	-ModelViewSet:5大接口都有了
        -ReadOnlyModelViewSet:获取一条和获取多条的接口
    	-GenericViewSet:ViewSetMixin+GenericAPIView        
        ViewSet:ViewSetMixin+APIView
        ViewSetMixin:类重写了as_view,路由配置就变样了(内有actions={‘get‘: ‘get_all_book‘})
            
# 10 路由
	-基本配置:跟之前一样
    -有action的:必须继承ViewSetMixin
    -自动生成:DefaultRouter和SimpleRouter(继承ViewSetMixin但是需要配置东西)
    	# 必须是继承ModelViewSet的视图类才能自动生成路由
    	-导入,实例化得到对象,注册多个,对象.urls(自动生成的路由)
        -路由相加urlpatterns+=router.urls/include:path(‘‘, include(router.urls))
    -视图类中自己定义的方法,如何自动生成路由
    	-在自己定义的方法上加装饰器(action)
        -两个参数methods=[GET,POST],表示这两种请求都能接受
        -两个参数detail=True,表示生成带pk的连接
# 11 三大认证(内置很少用的到就没将 翻笔记一下就可以看的懂)
	-认证组件:校验用户是否登录
    	-写一个认证类,继承BaseAuthentication,重写authenticate,内部写认证逻辑,认证通过返回两个值,第一个是user,认证失败,抛去异常 raise AuthenticationFailed(‘xxxx‘)
        -全局使用,局部使用,局部禁用[空局部就行]
    -权限:校验用户是否有权限进行后续操作
    	-写一个类,继承BasePermission,重写has_permission,返回True或False(判断是否有权限)
        -全局使用,局部使用,局部禁用
    -频率:限制用户访问频次
    	-写一个类,继承SimpleRateThrottle,重写get_cache_key,返回什么,就以谁做限制,scop=luffy字段,需要跟setting中的key对应   luffy:3/h(一小时访问三次)min da
        
        -全局配置,局部配置,局部禁用
        -需求:发送短信验证码的接口,一分钟只能发送一次,局部使用,配在视图类上
# 12 解析器:前端传的编码格式,能不能解析(默认三种全配了,基本不需要改),可能你写了个上传文件接口,局部配置一下,只能传form-data格式  局部使用:MultiPartParser###from rest_framework.parsers import 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就是给你做了这个事),公司内部权限管理
		对外的权限管理就是用三大认证
	-用户表
    -用户组表
    -权限表
    -用户对用户组中间表
    -用户组对权限中间表
    -用户对权限中间表

drf jwt(总回顾)

标签:instance   对象传递   view   patch   min   turn   ted   简单   use   

原文地址:https://www.cnblogs.com/ouyangjintao/p/14957043.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!