• rest-framework(二)


    drf配置与视图简介

    原生django与drf比较:drf不受csrf认证限制

    '''
    drf-->一定是CBV
    1)drf一定需要在settings文件INSTALLED_APPS中注册
    2)在settings中配置drf框架自定义配置
    	REST_FRAMEWORK
    '''
    
    '''
    继承APIView类,没有关闭csrf中间件,也可以接收post请求
    class BookView(View):
        def get(self,request,*args,**kwargs):
            return JsonResponse({
                'msg':'view get ok'
            })
    
        def post(self,request,*args,**kwargs):
            return JsonResponse({
                'msg':'view post ok'
            })
    
    class BookAPIView(APIView):
        def get(self,request,*args,**kwargs):
            return JsonResponse({
                'msg':'view get ok'
            })
    
        def post(self,request,*args,**kwargs):
            return JsonResponse({
                'msg':'view post ok'
            })
    '''
    

    APIView请求生命周期

    '''
    1)APIView 继承了View类,重写了as_view和dispatch方法
    	继承了APIView都会被局部禁用csrf认证
    
    2)重写的as_view方法主体还是View的as_view,只是在返回视图view函数地址时,局部禁用csrf认证
    
    3)重写的dispatch方法
    	在执行逻辑前:请求模块(二次封装request),解析模块(三种数据包格式的数据解析)
    	在执行请求逻辑中:异常模块(执行出现出现任何异常交给异常处理)
    	在执行请求逻辑后:响应模块(二次封装response),渲染模块(响应的数据能JSON和页面两种渲染)
    '''
    
    '''
    APIView的as_view(局部禁用csrf) => 走父级的as_view调用dispatch分发请求 
    
    => APIView自己重写了dispatch,使用自己完成分发 => 分发前完成request二次封装、数据解析 
    
    => 三大认证 => 请求的实际响应(自己的视图类的处理分发) => 出现了异常,就会交给异常模块处理异常 
    
    => 响应模块完成响应、渲染模块可以json或浏览器两种方式渲染
    '''
    

    请求模块

    '''
    1)将wsgi的request对象转化成drf的Request类的对象
    
    2)封装后的request对象完全兼容wsgi的request对象,并且将原request对象保存在新request._request中
    	request._request 被 request完全兼容
    
    3)重新格式化请求数据存放位置
    	拼接参数:request.query_params
    	数据包参数:request.data
    	
    # 源码分析:
        # 入口:APIVIew的dispatch方法的
        	request=self.initialize_request(request, *args, **kwargs)
        # print(request._request.method)  # 在内部将wsgi的request赋值给request._request
        # print(request.method)  # 就是通过__getattr__走的是request._request.method
        # print(request.query_params)  # 走的是方法属性,就是给request._request.GET重新命名
        # print(request.data)  # 走的是方法属性,值依赖于request._full_data
    '''
    

    解析模块

    '''
    解析模块:只处理数据包参数 - form-data,urlencoded,json
    1)全局配置所有视图类的解析方式,解析配置可以配置三种
    
    2)局部配置当前视图类的解析方式,解析配置可以配置三种
    
    3)配置的查找顺序:局部(视图类的类属性) => 全局(settings文件的drf配置) => 默认(drf的默认配置)
    
    在settings配置自定义REST_FRAMEWORK ={}中配置
    	# 全局配置解析类:适用于所有视图类
        'DEFAULT_PARSER_CLASSES': [
            # 'rest_framework.parsers.JSONParser',
            # 'rest_framework.parsers.FormParser',
            # 'rest_framework.parsers.MultiPartParser'
        ],
        
        #局部配置
        在视图文件中直接导入from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
        在视图类中配置:
        	# 局部配置解析类:只适用当前视图类
        	parser_classes = [JSONParser, FormParser, MultiPartParser]
    '''
    

    响应模块

    '''
    data:响应数据
    status:响应的网络状态码
    -------------------------
    template_name:drf完成前后台不分离返回页面,但是就不可以返回data(不许用了解)
    headers:响应头,一般不规定,走默认
    exception:一般异常响应,会将其设置成True,默认False(不设置也没事)
    content_type:默认就是 application/json,不需要处理
    
    '''
    

    渲染模块

    '''
    # 可以全局与局部配置
    在settings配置自定义REST_FRAMEWORK ={}中配置
    	# 全局配置渲染类:适用于所有视图类
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            # 'rest_framework.renderers.BrowsableAPIRenderer',  # 上线后尽量关闭
        ],
        
        #局部配置
        在视图文件中直接导入from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
        在视图类中配置:
        	# 局部配置渲染类:只适用当前视图类
        renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    '''
    

    异常模块

    '''
    源码分析:
    	所有的异常被补货之后,都是在handle_exception函数中做处理
    	在对数据头进行处理之后,最终是通过get_exception_handler函数处理异常
    		exception_handler = self.get_exception_handler()
    	也就是说,所有的异常都是通过get_exception_handler方法去处理
    	exception_handler中药传入三个参数:exc异常对象,context中视图对象和请求对象,从而生成response
    
    '''
    

    '''
    1)在settings配置自定义REST_FRAMEWORK ={}中配置
        # 异常模块:异常处理函数
            # 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
            'EXCEPTION_HANDLER': 'api.exception.exception_handler',
    
    2)自定义exception_handler方法
    	....
    '''
    
    # 一定要在settings文件中将异常模块配置自己的异常处理函数
    from rest_framework.views import exception_handler as drf_exception_handler
    from rest_framework.response import Response
    
    def exception_handler(exc, context):
        response = drf_exception_handler(exc, context)
        detail = '%s - %s - %s' % (context.get('view'), context.get('request').method, exc)
        if not response:  # 服务端错误
            response =  Response({'detail': detail})
        else:
            response.data = {'detail': detail}
    
        # 核心:要将response.data.get('detail')信息记录到日志文件
        # logger.waring(response.data.get('detail'))
    
        return response
    
  • 相关阅读:
    pytorchdeeplabxception Public 分割模型训练
    浪潮服务器 使用远控安装centos图文步骤
    某系统开发全程记录(20220608)
    计算机网络协议
    使用ACME工具来生成TSL证书
    数据库日志文件ldf过大解决方案
    20192404 202120222 《网络与系统攻防技术》实验八实验报告
    收缩日志
    .NET Core WebAPI文件下载+断点续传+取消下载
    以管理员身份运行WinForm程序
  • 原文地址:https://www.cnblogs.com/samoo/p/12093844.html
Copyright © 2020-2023  润新知