CBV源码分析
路由如果这么配置:url(r'^test/', views.Test.as_view()),
请求通过中间件后进入路由--->根据路由匹配,一旦成功,会执行后面函数(request)---》本质就是执行了as_view内部的view函数----》内部又调用了self.dispatch---->根据请求方式,执行不同的方法(必然get请求,就会执行咱么写的视图类的get方法)
django编写resful接口的时候,Jsonresponse返回的字典如果里面有列表,需要加上safe= False
如果字典里面有中文会显示成二进制,我们要知道Jsonresponse内部其实就是做了一个json.dump操作,要让他不显示二进制需要在json.dumps(data,ensure_ascII = False),Jsonresponse有个参数json_dumps_param可以给他传哥字典,然后内部打散传给json.dumps,json_dumps_param={'ensure_ascII':' False'}
drf:APIView 的源码,Requset的源码
-安装:
-pip3 install djangorestframework
-pycharm中安装
-使用
-第一步,再写视图,都写cbv
from rest_framework.views import APIView
class Books(APIView):
pass
-在setting中配置
INSTALLED_APPS= [
。。。。。
'rest_framework'
]
源码分析:
继承了APIView 之后:
-1 所有的请求都没有csrf的认证了
-2 在APIView中as_view本质还是调用了父类的as_view(View的as_view)
-3 as_view中调用dispatch -----》这个dispatch是APIView的dispatch
APIVIew的dispatch方法:
-1 对原生request对象做了一层包装(面向对象的封装),以后再用的request对象都新的request对象
-2 在APIView中self.initial(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__方法)
APIView里面执行的还是原来的的as_view,不过加了点东西
csrf_exempt(view)只要是继承了APUIView的接口都没有crsf校验
之后走的dispatch就是走的APIView里面的
APIVIew的dispatch方法对原生request对象做了一层包装(面向对象的封装),
以后再用的request对象都新的request对象
-2 在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关