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