Django-DRF,request对象的封装。

256 阅读1分钟

1. request对象的封装。

通过django开发项目时,视图中的request是 django.core.handlers.wsgi.WSGIRequest 类的对象,包含了请求相关的所有数据。

# Django FBV
def index(request):
	request.method
	request.POST
	request.GET
  ...
  
# Django CBV
from django.views import View
class UserView(View):
	def get(self,request):
        request.method
        request.POST
        request.GET
        ...

使用drf框架时,视图中的request是rest_framework.request.Request类的对象,其实是对django的request进行了一次封装,包含了django原request对象以外,还包含其他后期会使用的其他对象。

# rest_framework.request.Request 类

class Request:
    def __init__(self, request, parsers=None, authenticators=None,negotiator=None, parser_context=None):
    	self._request = request
        self.parsers = parsers or ()
        self.authenticators = authenticators or ()
        ...
	
    @property
    def query_params(self):
        """
        More semantically correct name for request.GET.
        """
        return self._request.GET

    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
    
	def __getattr__(self, attr):
        try:
            return getattr(self._request, attr)  # self._request.method
        except AttributeError:
            return self.__getattribute__(attr)

在使用drf框架开发时,视图中的request对象与原来的request对象稍有不同。

from rest_framework.views import APIView
from rest_framework.response import Response
from django.views import View
from rest_framework.request import Request


class UserView(APIView):
    def get(self, request, *args, **kwargs):
        
        # 通过对象的嵌套直接找到原request
        request._request.method
        request._request.GET
        request._request.POST
        request._request.body
        
        # 直接读取新request对象中的值
        request.query_params  # 内部本质上就是 request._request.GET,获取的是GET方法
        request.data # 内部读取请求体中的数据                       

源码流程:

request对象封装.png