zoukankan      html  css  js  c++  java
  • day71 APIView生命周期

    '''
    Django-rest framework
    drf是django的插件,所以要提前安装django
    按命令:pip install djangorestframework
    使用drf时,要在settings中注册
    		INSTALLED_APPS = [
    			# drf一定需要注册
        		'rest_framework',
        		]
    drf框架自定义配置
    	REST_FRAMEWORK={}
    '''
    

    rest_framework框架的封装特点

    # rest_framework框架的封装特点
    import rest_framework
    from rest_framework.views import APIView
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework.exceptions import APIException
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.settings import APISettings
    from rest_framework.parsers import JSONParser
    from rest_framework.filters import OrderingFilter
    
    

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

    from django.views import View
    from django.http import JsonResponse
    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'
            })
    -----------------------------------------------------------
    from rest_framework.views import APIView
    from rest_framework.response import Response
    class BookAPIView(APIView):
        def get(self, request, *args, **kwargs):
            return Response({
                'msg': 'apiview get ok'
            })
        def post(self, request, *args, **kwargs):
            return Response({
                'msg': 'apiview post ok'
            })
    

    一、APIView的请求生命周期

    1)APIView类继承view类,重写了as_view和dispatch方法
    2)重写的as_view方法,主体还是View的as_view,只是在返回视图view函数地址时,局部禁用csrf认证
    3)重写的dispatch方法,
    在执行请求逻辑前:请求模块(二次封装request)、解析模块(三种数据包格式的数据解析)
    在执行请求逻辑中:异常模块(执行出现任何异常交给异常模块处理)
    在执行请求逻辑后:响应模块(二次封装response)、渲染模块(响应的数据能将JSON和页面两种渲染)

    生命周期

    二、请求模块

    1)将wsgi的request对象转化成drf的Request类的对象
    2)封装后的request对象完全兼容wsgi的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的默认配置)
    注:该模块了解,但是全局局部配置是重点

    源码分析:

    入口:APIVIew的dispatch方法的 request=self.initialize_request(request, *args, **kwargs)
    获取解析类:parsers=self.get_parsers(),
    获取局部全局默认配置查找顺序进行查找
    
    #views.py
    class BookAPIView(APIView):
        # 局部配置解析类:只适用当前视图类
        pars  er_classes = [JSONParser, FormParser, MultiPartParser]
    --------------------------------------------------------------------------------------------
    #settings.py
    # drf框架自定义配置
    REST_FRAMEWORK = {
        # 全局配置解析类:适用于所有视图类
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',
            'rest_framework.parsers.FormParser',
            'rest_framework.parsers.MultiPartParser'
        ],}
    

    四、响应模块

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

    class BookAPIView(APIView):
        # 局部配置解析类:只适用当前视图类
        parser_classes = [JSONParser, FormParser, MultiPartParser]
        # 局部配置渲染类:只适用当前视图类
        renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
        def get(self, request, *args, **kwargs):
            response = Response(
                data={
                    'msg': 'apiview get ok'
                },
                status=status.HTTP_404_NOT_FOUND,
            )
            print(response.data)
            return response
    

    五、渲染模块(了解)

    Postman请求结果是json,浏览器请求结果是页面,可以全局与局部配置

    #views.py
    class BookAPIView(APIView):
        # 局部配置解析类:只适用当前视图类
        parser_classes = [JSONParser, FormParser, MultiPartParser]
        # 局部配置渲染类:只适用当前视图类
        renderer_classes = [JSONRenderer, BrowsableAPIRenderer]
    
    #settings.py
    REST_FRAMEWORK = {
    	# 全局配置渲染类:适用于所有视图类
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            # 'rest_framework.renderers.BrowsableAPIRenderer',  # 上线后尽量关闭
        ],}
    

    六、异常模块

    1. context中封装了视图对象和请求对象

    2. 默认的exception_handler函数只处理客户端异常形成的response对象,服务器异常不作处理,返回none,一些其他类似语法错误由pycharm解释器捕捉提供

    3. 异常处理函数的配置路径:

      DEFAULTS = {'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',}

    REST_FRAMEWORK = {
    	 # 异常模块:异常处理函数
        # 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler',
        'EXCEPTION_HANDLER': 'api.exception.exception_handler',
        }
    

    新建一个exception.py

    # 一定要在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
    
    
    
  • 相关阅读:
    CSS的三种基本框架
    使用scrapy框架做赶集网爬虫
    JQuery将form表单值转换成json字符串函数
    Bootstrap Modal 使用remote从远程加载内容
    Java获取指定包名下的所有类的全类名的解决方案
    Linux下安装解压版(tar.gz)MySQL5.7
    Log4j2使用笔记
    Log4j使用笔记
    JavaWeb开发中采用FreeMarker生成Excel表格
    Linux下安装jdk+maven +git
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/12094169.html
Copyright © 2011-2022 走看看