- Title(EN): Django REST Framework Learning Notes (2): the request module
 
- Author: dog2
 
DRF请求生命周期流程
- 根据应用中
urls.py,走as_view方法,但是视图类没有该方法,所以请求走的是APIView的as_view方法 
- 在
APIView的as_view调用父类(django原生View)的as_view,同时还禁用了 csrf 认证 
- 在父类(django原生View)的
as_view中dispatch方法请求走的又是APIView的dispatch
- 因为
APIView也可以走dispatch,视图类是先继承APIView,APIView中没有再去原生View中 
 
- 完成任务方法交给视图类的请求函数处理,得到请求的响应结果,返回给前台
 
因此直接从APIView的dispatch入口看源码。
请求模块
基本信息
源码分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   |  request = self.initialize_request(request, *args, **kwargs)   
 
  return Request(   request,   ... )
 
  self._request = request         
 
  try:     return getattr(self._request, attr)   except AttributeError:     return self.__getattribute__(attr)
 
  | 
 
总结
- drf 对原生
request做了二次封装,设置request._request等于原生request 
- 原生
request对象的属性和方法都可以被drf的request对象直接访问(兼容) 
- drf请求的所有url拼接参数均被解析到
query_params中,所有数据包数据都被parser解析到data中
- get请求:url中拼接的参数通过
request.query_params获取 
- post请求:所有请求方式所携带的数据包都是通过
request.data获取 
 
用法示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | class Test(APIView):     def get(self, request, *args, **kwargs):                  print(request._request.GET)           print(request.GET)          print(request.query_params) 
          return Response('drf get ok')
      def post(self, request, *args, **kwargs):                  print(request._request.POST)           print(request.POST)           print(request.data)  
          print(request.query_params)
          return Response('drf post ok')
   |