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

admin后台注册model

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

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

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

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

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

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

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

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

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

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路径下)

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

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

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

 三、drf请求生命周期

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

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

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

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

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

上一篇:hdu-------1081To The Max


下一篇:Python中itertools模块