经过REST framework传入视图函数的request已经不是原来的request,而是Request的类产生的对象request。
REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型(如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
data
POST、PUT、PATCH请求方式解析后的数据。(原生django的PUT请求在request.POST中取不到。)
query_params
与原生的GET一样。
其他的方法和原来的request使用方法一致:
底层原理:在Request实例化对象时,self._request = request,将原来的request对象给了Request的对象,又在Request类中定义了__getattr__魔法方法,当在视图函数中获取request对象的属性和方法时,找不到会触发魔法方法的执行,利用反射获取原来的request对象中的方法。
def __getattr__(self, attr): """ If an attribute does not exist on this instance, then we also attempt to proxy it to the underlying HttpRequest object. """ try: return getattr(self._request, attr) except AttributeError: return self.__getattribute__(attr)'运行
实例化参数
class Test(APIView):
def get(self, request):
return Response(data={}, status=status.HTTP_201_CREATED, headers={'name': 'jasper'})

drf默认能够解析urlencoded、form-data、json
其实是通过配置文件配置的,在rest_framework包下的settings.py中。
DEFAULTS = {
# Base API policies
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # 可以解析json格式
'rest_framework.parsers.FormParser', # 可以解析urlencoded格式
'rest_framework.parsers.MultiPartParser' # 可以解析form-data格式
],
想在项目中配置REST_FRAMEWORK,需要像下边这样在项目配置文件中配置。
""" Settings for REST framework are all namespaced in the REST_FRAMEWORK setting. For example your project's `settings.py` file might look like this: REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.TemplateHTMLRenderer', ], 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ], } """'运行
如果想让视图函数只解析指定格式的方法:
方式一:
在项目的settings.py中配置REST_FRAMEWORK。
REST_FRAMEWORK = { 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', # 'rest_framework.parsers.FormParser', # 'rest_framework.parsers.MultiPartParser', ], }'运行
方式二:
在视图类中定义parser_classes属性。
class Test(APIView):
from rest_framework.parsers import JSONParser, MultiPartParser, FormParser
parser_classes = [JSONParser]
def post(self, request):
return Response(request.data)

总结:解析类的执行顺序,先执行视图类自己的,在执行项目配置文件中的,最后执行rest_framework里的配置文件。
默认情况下,相应编码是根据客户端的类型而定的,浏览器访问的话相应编码就是text/html,postman的相应编码是application/json。
配置相应编码格式也是两种方式
方式一:配置文件中配置
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer', # 只能相应json格式数据
# 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览器格式
],
方式二:在视图类中配置
from rest_framework.renderers import JSONRenderer, BaseRenderer
renderer_classes = [BaseRenderer]