Django DRF中的request.data与Django中的request.body

Django DRF中的request.data与Django中的request.body

request.data与Django中的request.body区别,如何选择?

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),它更方便处理.

DRF视图中的request

相对于django框架,DRF工程的request类则是继承自HttpRequest类,Rest framework提供了parser解释器,用来解释请求中的content_type中的请求数据类型例如json、表单等。将请求数据进行parser解析,解析成类字典对象保存到request对象中。

常用的方法:request.data(返回解析之后的请求体)

Django默认的View请求对象是 HttpRequest,REST framework 的请求对象是 Request。
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。

  • HttpRequest.GET ————> Request.query_params
  • HttpRequest.POST 、HttpRequest.body————> Request.data

request.data如何使用

  1. settings.py注册app,引入’rest_framework’
INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',  # 使用drf
  1. 视图类集成drf相关视图类,如APIView
# 视图类继承APIView后,执行流程就发生了变化,这个变化就是整个的drf的执行流程

# 一旦继承了APIView入口
	-路由配置跟之前继承View是一样的----》找视图类的as_view---》【APIView的as_view】
  1. 视图方法使用时,直接使用 request.data 即可!
@action(methods=['POST'], detail=False)
def verify_signature(self, request):
    logger.debug("verify_signature request.body: %s", request.data)

工作常见问题

you cannot access body after reading from request’s data stream

问题描述:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值