APIView源码与Request源码分析

一、APIView源码分析

1、安装djangorestframework

APIView源码与Request源码分析

2、使用

drf是基于cbv view的封装,所以必须写cbv

①第一步:写视图,必须写cbv

路由配置:APIView源码与Request源码分析

from rest_framework.views import APIView
from django.http import JsonResponse
class Books(APIView):
def get(self, request):
# request是被封装后的request,原生的request在request._request
# 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
# 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
# request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
# request.data
# request.query_params 是原来django原生的GET中的数据
# self.FILES 就是上传的文件
dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
return JsonResponse(dic)

②第二步:

  在setting中配置:INSTALLED_APPS= ['rest_framework']

APIView源码与Request源码分析

3、源码分析

继承了APIView之后:

  ①所有的请求都没有csrf的认证了

APIView源码与Request源码分析

  ②在APIView中as_view本质还是调用了父类的as_view(View的as_view)

APIView源码与Request源码分析

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

  注意:找dispatch不能直接点源码找先要在类里找类没有再去父类里面找

APIView源码与Request源码分析

APIView的dispatch方法:

①对原生request对象做了一层包装(面向对象的封装),

APIView源码与Request源码分析

  以后再用的request对象都新的request对象

APIView源码与Request源码分析

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

APIView源码与Request源码分析

  ③根据请求方法执行咱们写的视图类中的相应方法 (视图类中方法的request对象,已经变成了封装后的request)

APIView源码与Request源码分析

二、request源码分析

APIView源码与Request源码分析

①新的request为啥能点出原来的属性:

内部反射在原生的request取出GET,POST,因为Request重写了__getattr__方法,跟原来用法一样

APIView源码与Request源码分析

②原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理

不管前端传数据的编码格式是urlencoded,form_data或者是json,都从request.data里面取值

APIView源码与Request源码分析

③请求里面可以带过滤条件这里就是用到query_params,是原来django原生的GET的数据

APIView源码与Request源码分析

④上传的文件是从FILES中取(request.FILES)

APIView源码与Request源码分析


总结:

继承了APIView之后:
所有的请求都没有csrf的认证了
在APIView中as_view本质还是调用了父类的as_view(View的as_view)
as_view中调用了dispatch(这个dispatch是APIView的dispatch) APIView的dispatch方法:
对原生的request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象
在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
根据请求方法执行咱们写的视图类中的相应方法(视图类中方法的request对象,已经变成了封装后的request) request类
原生的request是self._request
取以post提交的数据,从request.data中取出(urlencoded, form_data, json格式) query_params 就是原生request的GET的数据
上传的文件是从FILES中取(request.FILES)
(重点)其他的属性,直接request.属性名(因为重写了__getattr__方法) class Books(APIView):
def get(self, request):
# request是被封装后的request,原生的request在request._request
# 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
# 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
# request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
# request.data
# request.query_params 是原来django原生的GET中的数据
# self.FILES 就是上传的文件
dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
return JsonResponse(dic)
上一篇:Python+requests库 POST接口图片上传


下一篇:Jquery全选系列操作(锋利的jQuery)