Django CBV 及DRF源码分析

CBV 源码分析

定义cbv视图:

class Test(View):
    def post(self,request):
        return HttpResponse('post')
    def get(self,request):
        return HttpResponse('get')

配置路由:

url(r'^test/', views.Test.as_view()),

执行流程:

  • 请求通过中间件后进入路由

1561981347741

  • 根据路由匹配,一旦成功,会执行后面函数,并把request当作参数传入

1561981486381

  • 本质就是执行了as_view内部的view函数

1561981535046

  • 内部又调用了self.dispatch

1561981574509

  • 根据请求方式,执行不同的方法(如果是get请求,就会执行自己定义的视图类的get方法)

1561982188160

self.http_method_names中包含的请求方式:

1561982243559

DRF(Django REST framework)

现在前后端分离的架构设计越来越流行,业界甚至出现了API优先的趋势。

显然API开发已经成为后端程序员的必备技能了,那作为Python程序员特别推荐Django REST framework(DRF)这个API框架。

Django REST framework(DRF)框架文档齐全,社区较稳定,而且由于它是基于Django这个十分全面的框架而设计开发的,能够让开发者根据自己的业务需要,使用极少的代码量快速的开发一套符合RESTful风格的API,并且还支持自动生成API文档。

安装:

pip3 install djangorestframework

使用:

第一步:定义CBV视图函数
	from rest_framework.views import APIView
	class Books(APIView):
		pass
第二步:在setting中配置
INSTALLED_APPS= [
	......
	'rest_framework'
]

APIView 的源码和Requset的源码

继承了APIView 之后:

1561983503527

  • 所有的请求都没有csrf的认证
  • 在APIView中as_view本质还是调用了父类的as_view(View的as_view)

1561984178109

  • as_view中调用dispatch(这个dispatch是APIView的dispatch)

1561984555843

APIVIew的dispatch方法:
1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象,原生的request在request._request

1561986469570

​ 2 在APIView中self.initialze(request, *args, **kwargs),里面有频率控制,权限控制和认证相关

1561986763643

​ 3 根据请求方法执行咱们写的视图类中的相应方法

1561986976581

视图类中方法的request对象,已经变成了封装后的request
Request类:

​ 1 原生的request是self._request

​ 2 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)

1561987652604

​ 3 query_params 就是原生request的GET的数据

1561987737466

​ 4 上传的文件是从FILES中取

1561987807501

​ 5 (重点)其他的属性,直接request.属性名(因为重写了__ getattr __方法)

1561987280092

猜你喜欢

转载自blog.csdn.net/linwow/article/details/94410421