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

 

posted @ 2019-12-05 20:35  只会玩辅助  阅读(801)  评论(0编辑  收藏  举报