APIView源码解析
入口也是as_view()apiview的as_view
里面调用了一个super()方法 调用父类的as_view
返回了一个csrf_exempt(viwe)
在函数上加上装饰器防止csrf的报错 本质就相当于这个csrf_exempt(viwe)
当请求来的时候,路由匹配成功会执行:
view类的as_view类方法内的view闭包函数 但是没有了csrf认证

首先去找apiview的as_view里的self.dispatch
第一步: def dispatch(self, request, *args, **kwargs)
这个request是原来dajngo的request
第二步: request = self.initialize_request(request, *args, **kwargs)
这个request是Request类的对象,新的request 相当于return Request(request)
第三步:self.request = request
相当于把视图类的request换成了这个= request

'''最核心的部分是在异常捕获这里'''
第四步:try 最核心的部分
第五步:在try中执行了if判断request.method的方法
第六步:在try中执行上面的认证的方法时出现了异常,能被捕获并处理(全局异常)

总结:
1.只要继承apiview 就没有csrf的认证
2.request对象变成了drf提供的Request类的对象
3.在执行视图函数类之前先执行了三大认证 (认证,频率,权限)
4.在执行认证的时候出现异常都会被捕获并处理,处理完就可以继续执行视图函数的方法
Request类源码解析
导入Request模块查看源码,类中有一个__getattr__ 方法
查看对象属性的方法:对象.__dict__ 没有返回方法的时候就是不存在的属性
self._request 是django原生的request
通过getattr获取到的方法 获取到的就是django原生的request里面的方法

与request方法就是多了两个被@property装饰的方法:
1.data :
无论获取哪种格式的数据 都可以直接用request.data
(urlencoded,form-data,json)
2.query_params:
request.query_params等同于request.GET方法

用装饰器让FBV的request方法拥有data属性
def out(func_name):
def inner(request, *args, **kwargs):
try:
request.data = request.POST
except:
request.data = json.loads(request.body)
res = func_name(request, *args, **kwargs)
return res
return inner
@out
def func(request):
print(request.data)
return JsonResponse({})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现