0902自我总结
Django 与drf 源码视图解析
一.原生Django CBV 源码分析:View
1""" 21)as_view()是入口,得到view函数地址 32)请求来了调用view函数,内部调用dispatch函数完成请求分发 43)dispatch函数将请求方式映射成视图类的同名方法,完成请求的处理,得到相应 54)再将相应的结果一层层返回 6"""
二.drf CBV 源码分析:APIView
1""" 21)as_view()是入口,得到view函数地址,在范围view函数地址时局部禁用csrf认证 32)请求来了调用view函数,内部调用(APIView类的)dispatch函数完成请求分发 43)dispatch函数 二次封装request、完成三大认证后,再将请求方式映射成视图类的同名方法,完成请求的处理,得到相应,再对相应做渲染处理 54)再将相应的结果一层层返回 6"""
三.APIView做的处理
-
as_view:就干了一件事,禁用csrf认证 -
dispatch:- 1)二次封装request
- 2)三大认证
四.drf 的局部渲染和全局渲染
通过看了源码我们对于渲染内容是JSONRenderer还是BrowsableAPIRenderer
JSONRenderer与BrowsableAPIRenderer的导入
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import BrowsableAPIRenderer
-
局部设置
- 在我们定义基础APIView的类添加
renderer_classes = [JSONRenderer]这样网页就不会出现渲染只显示js数据
例如
1class UserAPIView(APIView): 2 renderer_classes = [JSONRenderer] 3 4 def get(self, request, *args, **kwargs): 5 print(request.query_params) 6 data = { 7 'status': 0, 8 'msg': 'get ok', 9 'results': [], 10 'token': '123.12321.231' 11 } 12 return Response( 13 data=data, 14 status=status.HTTP_200_OK, 15 headers={'Token': '123as.masd21.asd213sd'}, 16 content_type='application/json' # 默认就是application/json 17 ) - 在我们定义基础APIView的类添加
-
全局设置在
setting1# drf配置 2REST_FRAMEWORK = { 3 # 响应的渲染模块 4 'DEFAULT_RENDERER_CLASSES': [ 5 'rest_framework.renderers.JSONRenderer', 6 'rest_framework.renderers.BrowsableAPIRenderer', 7 ], 8 'DEFAULT_PARSER_CLASSES': [ 9 'rest_framework.parsers.JSONParser', # 'application/json' 10 'rest_framework.parsers.FormParser', # 'application/x-www-form-urlencoded' 11 'rest_framework.parsers.MultiPartParser' # multipart/form-data 12 ], 13}