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()),
执行流程:
- 请求通过中间件后进入路由
- 根据路由匹配,一旦成功,会执行后面函数,并把request当作参数传入
- 本质就是执行了as_view内部的view函数
- 内部又调用了self.dispatch
- 根据请求方式,执行不同的方法(如果是get请求,就会执行自己定义的视图类的get方法)
self.http_method_names中包含的请求方式:
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 之后:
- 所有的请求都没有csrf的认证
- 在APIView中as_view本质还是调用了父类的as_view(View的as_view)
- as_view中调用dispatch(这个dispatch是APIView的dispatch)
APIVIew的dispatch方法:
1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象,原生的request在request._request
2 在APIView中self.initialze(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
3 根据请求方法执行咱们写的视图类中的相应方法
视图类中方法的request对象,已经变成了封装后的request
Request类:
1 原生的request是self._request
2 取以post形式提交的数据,从request.data中取(urlencoded,formdata,json格式)
3 query_params 就是原生request的GET的数据
4 上传的文件是从FILES中取
5 (重点)其他的属性,直接request.属性名(因为重写了__ getattr __方法)