Django REST框架引入了一个扩展常规HttpRequest的Request对象,这个新对象类型必须request.data
访问’POST’,'PUT’和’PATCH’请求的JSON数据.
request.body参数也可以来获取相同的数据,该参数是原始Django HttpRequest类型对象的一部分。
REST框架引入了一个Request对象,该对象扩展了常规的HttpRequest,并提供了更灵活的请求解析.Request对象的核心功能是request.data属性,它类似于request.POST,但对于使用Web API更有用.
request.POST#仅处理表单数据.仅适用于’POST’方法.
request.data #处理任意数据.适用于’POST’,'PUT’和’PATCH’方法.
request.body 是字节,它总是可用的,因此没有使用限制
request.data 是一个“属性”方法,可以引发异常,但它为您提供解析数据,这更方便
当访问 request.data 时,REST framework 将检查传入请求的 Content-Type 标头,并确定使用哪个解析器来解析请求内容。
在一些情况下,我不想访问request.data,而是raw request.body。请求data返回的是带有已解析 json 的 python 字典。 veryfing 签名,我必须将原始请求正文作为字符串。
总结:首选DRF的
request.data
。除非您想要处理二进制图像或XML有效负载,否则永远不要使用request.body它,它只是一个包含请求正文的简单字符串.总是使用哪个是request.data完全解析的主体(即Python dict),它更方便处理.
相对于django框架,DRF工程的request类则是继承自HttpRequest类,Rest framework提供了parser解释器,用来解释请求中的content_type中的请求数据类型例如json、表单等。将请求数据进行parser解析,解析成类字典对象保存到request对象中。
常用的方法:request.data(返回解析之后的请求体)
Django默认的View请求对象是 HttpRequest,REST framework 的请求对象是 Request。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework', # 使用drf
# 视图类继承APIView后,执行流程就发生了变化,这个变化就是整个的drf的执行流程
# 一旦继承了APIView入口
-路由配置跟之前继承View是一样的----》找视图类的as_view---》【APIView的as_view】
request.data
即可!@action(methods=['POST'], detail=False)
def verify_signature(self, request):
logger.debug("verify_signature request.body: %s", request.data)
问题描述:
request.body.decode(“utf-8”) 报错 you cannot access body after reading from request’s data stream
问题原因:
Django只允许读取一次POST正文,多次读取时,会报该错误
例如,view参数 的 args[1].data,也算读取一次,你再执行request.body.decode(“utf-8”) ,就会报 you cannot access body after reading from request’s data stream