DRF Django REST framework 之 解析器(二)

时间:2022-08-18 11:19:38

引入

Django Rest framework帮助我们实现了处理application/json协议请求的数据,如果不使用DRF,直接从 request.body 里面拿到原始的客户端请求的字节数据,经过 decode ,然后 json 反序列化之后,也可以得到一个Python字典类型的数据。

但是,这种方式并不被推荐,因为已经有了非常优秀的第三方工具,那就是Django Rest framework的解析器组件。

解析器使用

使用方式非常简单,分为如下两步:

  • from rest_framework.views import APIView
  • 继承 APIView
  • 直接使用 request.data 就可以获取Json数据

如果你只需要解析Json数据,不允许任何其他类型的数据请求,可以这样做:

  • from rest_framework.parsers import JsonParser
  • 给视图类定义一个 parser_classes 变量,值为列表类型 [JsonParser]
  • 如果 parser_classes = [] , 那就不处理任何数据类型的请求了。
from django.shortcuts import render, HttpResponse

from rest_framework.views import APIView
from rest_framework.parsers import FormParser class CourseView(APIView):
parser_classes = [FormParser]
def get(self, request):
pass def post(self, request):
# request是被DRF封装的新对象,基于django的request
# request.data是一个property,用于对数据进行校验
# request.data最后会找到self.parser_classes中的解析器
# 来实现对数据进行解析
data = request.data
print(data) # {"course_name": "高数", "description": "烧脑..."}
return HttpResponse(data)

解析器请求流程

1. 路由层加载as_view()方法,url和视图函数之间的绑定关系建立。

APIView执行方式相同

2. 用户发起请求,www.xxx.com/course/    POST请求方式

class CourseView(APIView):
parser_classes = [FormParser]
def get(self, request):
pass def post(self, request): # 执行
# request是被DRF封装的新对象,基于django的request
# request.data是一个property,用于对数据进行校验
# request.data最后会找到self.parser_classes中的解析器
# 来实现对数据进行解析
data = request.data
print(data) # {"course_name": "高数", "description": "烧脑..."}
return HttpResponse(data)

3. request.data 触发解析操作

  (1)在 APIView 中的重写了 request 对象,在该对象中找  request.data

  DRF Django REST framework  之  解析器(二)

  (2) 在 self.load_data_and_files() 中把解析之后的数据赋值给了 self._full_data

  DRF Django REST framework  之  解析器(二)

  (3) 执行 _parse() 方法, 返回解析之后的数据

  DRF Django REST framework  之  解析器(二)

  实例化 Request 对象时,传入了 parsers 

  DRF Django REST framework  之  解析器(二)

   get_parsers() 返回的是一个列表

  DRF Django REST framework  之  解析器(二)

  调用 parser_classes 属性

  DRF Django REST framework  之  解析器(二)

   api_settings 是个实例化对象,而且该对象中没有 DEFAULT_PARSER_CLASSES 属性,所以执行 __getattr__() 方法。

  DRF Django REST framework  之  解析器(二)

   perform_import() 方法

  DRF Django REST framework  之  解析器(二)

  以上是选择解析类的流程

DRF Django REST framework 之 解析器(二)的更多相关文章

  1. Django Rest framework 之 解析器

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  2. Django Rest Framework之解析器

    基本代码结构 urls.py: from django.conf.urls import url, include from web.views.s5_parser import TestView u ...

  3. Django REST framework的解析器与渲染器

    解析器 解析器的作用 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己可以处理的数据.本质就是对请求体中的数据进行解析. 在了解解析器之前,我们要先知道Accept以及ContentTy ...

  4. 轻轻松松学会 DRF Django REST framework

    据我了解,目前的IT行业的大部分后端开发,都是需要进行前后端分离的,而前后端分类必不可少的是rest 规范,以下是django rest framework的学习路径: DRF Django REST ...

  5. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

    一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 impo ...

  6. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  7. DRF频率、分页、解析器、渲染器

    DRF的频率 频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通过自己定 ...

  8. Django REST Framework - 分页 - 渲染器 - 解析器

    为什么要使用分页? 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会 ...

  9. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

随机推荐

  1. Neural Style学习3——操作

    Basic usage: th neural_style.lua -style_image <image.jpg> -content_image <image.jpg> Ope ...

  2. jQuery triger与trigerHandler的区别

    trigger(event, [data]) 与 triggerHandler(event, [data]) 都是用于触发一个事件. 其两者的区别在于,如果触发的事件是有浏览器默认行为的,trigge ...

  3. 通过开源程序同时解决DNS劫持和DNS污染的问题

    我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染.关于DNS劫持和DNS污染的区别,请查找 ...

  4. java常用正则表达式

    1.邮编 public static final String POSTAL_CODE = "^\\d{6}$"; 2. email(支持中文域名邮箱) 正则表达式  public ...

  5. 什么是Intent&lpar;意图&rpar;

    1.Intent是一种运行时绑定(runtime bingding)机制,它能在程序运行的过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种 请求或者意愿,Android ...

  6. mybatis之动态SQL

    <if>的使用 如果第一个if不成立的话可能会出现where and的语法错误,解决方法是在外层加<where>标签,此时如果以and和or衔接where的话会被删除. &lt ...

  7. poj 2723 二分&plus;2-sat判定

    题意:给出n对钥匙,每对钥匙只能选其中一个,在给出每层门需要的两个钥匙,只要一个钥匙就能开门,问最多能到哪层. 思路:了解了2-SAT判定的问题之后主要就是建图的问题了,这里建图就是对于2*n个钥匙, ...

  8. 【题解】 bzoj3555&colon; &lbrack;Ctsc2014&rsqb;企鹅QQ (字符串Hash)

    题面戳我 Solution 我们分析题意,他要求的是两个字符串只有一个字符不同,然后我们再看长度\(L \leq 200\),显然我们就可以把每一位删除后\(Hash\),然后判断相同个数即可 我一开 ...

  9. P1040 加分二叉树 区间dp

    题目描述 设一个nn个节点的二叉树tree的中序遍历为(1,2,3,…,n1,2,3,…,n),其中数字1,2,3,…,n1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第ii个节 ...

  10. BesLyric 全新版本下载 ( windows &bsol; mac &bsol; linux )

    导读 BesLyric , 一款专门制作 网易云音乐 LRC 滚动歌词的软件! 搜索.下载.制作 歌词更方便! 很荣幸地,自 beslyric 2017 年开发推出以来,得到了很多云村村民的肯定,现在 ...