- 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')
|