APIView源码与Request源码分析
一、APIView源码分析
1、安装djangorestframework
2、使用
drf是基于cbv view的封装,所以必须写cbv
①第一步:写视图,必须写cbv
路由配置:
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']
3、源码分析
继承了APIView之后:
①所有的请求都没有csrf的认证了
②在APIView中as_view本质还是调用了父类的as_view(View的as_view)
③as_view中调用了dispatch(这个dispatch是APIView的dispatch)
注意:找dispatch不能直接点源码找先要在类里找类没有再去父类里面找
APIView的dispatch方法:
①对原生request对象做了一层包装(面向对象的封装),
以后再用的request对象都新的request对象
②在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
③根据请求方法执行咱们写的视图类中的相应方法 (视图类中方法的request对象,已经变成了封装后的request)
二、request源码分析
①新的request为啥能点出原来的属性:
内部反射在原生的request取出GET,POST,因为Request重写了__getattr__方法,跟原来用法一样
②原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
不管前端传数据的编码格式是urlencoded,form_data或者是json,都从request.data里面取值
③请求里面可以带过滤条件这里就是用到query_params,是原来django原生的GET的数据
④上传的文件是从FILES中取(request.FILES)
总结:
继承了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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现