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 # 内部读取请求体中的数据
源码流程: