• 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 视图类集成drf相关视图类,如APIView
    # 视图类继承APIView后,执行流程就发生了变化,这个变化就是整个的drf的执行流程
    
    # 一旦继承了APIView入口
    	-路由配置跟之前继承View是一样的----》找视图类的as_view---》【APIView的as_view】
    
    • 1
    • 2
    • 3
    • 4
    1. 视图方法使用时,直接使用 request.data 即可!
    @action(methods=['POST'], detail=False)
    def verify_signature(self, request):
        logger.debug("verify_signature request.body: %s", request.data)
    
    • 1
    • 2
    • 3

    工作常见问题

    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

  • 相关阅读:
    HDMI协议介绍(五)--Audio
    XSS高级 svg 复现一个循环问题以及两个循环问题
    leetcode621 任务调度器
    模块化设计的耳机,找到属于你的色彩,魔尼悉比Rainbow耳机体验
    C++ STL重点、难点复习总结
    vue脚手架创建项目:账号登录(利用element-ui快速开发)(取消eslint强制格式)(修改端口号)
    《软件工程导论(第六版)》 张海藩 复习笔记
    React-fiber基础之requestAnimationFrame和requestIdleCallback
    Flutter组件-Material属性
    【golang】mysql默认排序无法实现 使用golang实现对时间字符串字段的排序
  • 原文地址:https://blog.csdn.net/inthat/article/details/127967755