以前我们通过django开发项目时,视图中的request是 django.core.handlers.wsgi.WSGIRequest 类的对象,其中包含了请求相关的所有数据。
# Django FBVdef index(request):request.methodrequest.POSTrequest.GETrequest.body# Django CBVfrom django.views import Viewclass UserView(View):def get(self,request):request.methodrequest.POSTrequest.GETrequest.body
而在使用drf框架时,视图中的request是rest_framework.request.Request类的对象,其是又对django的request进行了一次封装,包含了除django原request对象以外,还包含其他后期会使用的其他对象。对象 = (request, 其他数据)
# rest_framework.request.Request 类class Request:"""Wrapper allowing to enhance a standard `HttpRequest` instance.Kwargs:- request(HttpRequest). The original request instance. (django中的request)- parsers(list/tuple). The parsers to use for parsing therequest content.- authenticators(list/tuple). The authenticators used to tryauthenticating the request's user."""def __init__(self, request, parsers=None, authenticators=None,negotiator=None, parser_context=None):self._request = requestself.parsers = parsers or ()self.authenticators = authenticators or ()...@propertydef query_params(self):"""More semantically correct name for request.GET."""return self._request.GET@propertydef data(self):if not _hasattr(self, '_full_data'):self._load_data_and_files()return self._full_datadef __getattr__(self, attr):try:return getattr(self._request, attr) # self._request.methodexcept AttributeError:return self.__getattribute__(attr)
所以,在使用drf框架开发时,视图中的request对象与原来的有些不同,例如:
from rest_framework.views import APIViewfrom rest_framework.response import Responsefrom django.views import Viewfrom rest_framework.request import Requestclass UserView(APIView):def get(self, request, *args, **kwargs):# 通过对象的嵌套直接找到原request,读取相关值request._request.methodrequest._request.GETrequest._request.POSTrequest._request.body# 举例:content-type: url-form-encodedv1=123&v2=456&v3=999django一旦读取到这个请求头之后,就会按照 {"v1":123,"v2":456,"v3":999}content-type: application/json{"v1":123,"v2":456}request._request.POSTrequest._request.body# 直接读取新request对象中的值,一般此处会对原始的数据进行一些处理,方便开发者在视图中使用。request.query_params # 内部本质上就是 request._request.GETrequest.data # 内部读取请求体中的数据,并进行处理,例如:请求者发来JSON格式,他的内部会对json字符串进行反序列化。# 通过 __getattr__ 去访问 request._request 中的值request.method
可以发现,drf对原来的request对象进行了补充
- request.data = request.POST/request.body
- 也支持request.method
底层源码实现:
