• drf复习(一)--原生djangoCBV请求生命周期源码分析、drf自定义配置文件、drf请求生命周期dispatch源码分析


    admin后台注册model

     一、原生djangoCBV请求生命周期源码分析

    原生view的源码路径(django/views/generic/base.py)

    1.从urls.py中as_view()入手,进入as_view()的源码,前台传递的数据都进入as_view()函数

    2.进入as_view()中view()函数接收前台传递过来的参数处理,dispath()把返回值分发下去,进入dispatch源码

    3.dispatch源码分析,最后的返回值handler是对象.请求方式

    dispatch本质:是返回值handler的结果,handler结果是views视图中功能函数(get,post此类请求)的结果,views功能函数的结果就是返回页面的结果(render,HttpResponse,redict等响应)

     整个流程总结:

    从url的as_view()进入,as_view()函数中的view()函数返回值dispatch。进入dispatch(),dispatch的返回值handler是对象.请求方式的返回值,对象.请求方式的值就是views视图中各个请求方式的返回值,这样就串起来了。

     二.drf自定义配置文件

     1.首先是一些配置文件(原生settings配置文件在rest_framework/settings/APISettings路径下)

     如果你想自定义配置,可以在项目的settings.py文件中这样写(下面是用两个模块举例)

     三、drf请求生命周期

    APIView源码路径(rest_framework/views.py)(******)

    1.也是从as_view()进入,因为Test没有as_view这个方法,所以只能走父类APIView的as_view

     

    2.请求走的是APIView的as_view函数

    3.APIView的as_view调用父类的(django原生)的as_view方法,同时还禁用了csrf认证

    4.重写了父类的dispatch方法,完成任务方法交给视图类请求函数处理,得到请求的响应结果response,返回给前台。

    总结:大致流程和原生django的生命周期类似,但是dispatch中有一些其他用法,以后APIView源码分析可以直接从dispatch中入手

    APIView中dispatch源码

    dispatch中包括(请求模块request,三大认证,异常模块,渲染模块render)

        def dispatch(self, request, *args, **kwargs):
            
            self.args = args
            self.kwargs = kwargs
            #二次封装request
            #请求模块
            request = self.initialize_request(request, *args, **kwargs)
            self.request = request
            self.headers = self.default_response_headers  # deprecate?
    
            try:
                #做三大认证(在请求对象request和请求执行之间)
                self.initial(request, *args, **kwargs)
                #原生django也是这样写
                if request.method.lower() in self.http_method_names:
                    handler = getattr(self, request.method.lower(),
                                      self.http_method_not_allowed)
                else:
                    #原生django提供的异常
                    handler = self.http_method_not_allowed
                response = handler(request, *args, **kwargs)
    
            except Exception as exc:
                #处理认证失败,drf提供的异常
                #异常模块
                response = self.handle_exception(exc)
            #渲染模块
            #返回值给前台
            self.response = self.finalize_response(request, response, *args, **kwargs)
            return self.response

    具体的模块分析请到之前的drf笔记中

    https://www.cnblogs.com/wangcuican/p/11674996.html

  • 相关阅读:
    bat %n 判断传入的参数值和使用注意
    git ls-remote url,判断 url 是否存在
    bat 读取 ini 文件
    bat 提示窗口,带换行
    python .pth 文件 和 site 模块
    python Pillow 图片处理模块,好强大有没有
    Python 获取 exe 的 icon 并且保存
    git 判断路径是否是 git 仓库
    Python 去除字符串中的空行
    Android平台程序崩溃的类型及原因列举
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11991750.html
Copyright © 2020-2023  润新知