[Python自学] restframework (5) (解析器)

一、数据解析器

1.Django默认的数据解析

在我们使用django框架时,浏览器如果发送以下类型的POST数据:

Content-Type=application/x-www-form-urlencoded
Content-Type=application/form-data

则django会自动帮我们将请求体中的数据转换为字典,保存在request.POST中。

但是,如果浏览器发送的是json数据:

Content-Type=application/json

则django无法为我们转换,我们只能从request.body中获取原始数据,自己进行转换。

2.restframework提供的解析器

如果我们使用restframework,他给我们提供了几个常用的数据解析器,列表如下:

from rest_framework import parsers

# 处理json数据,media_type = ‘application/json‘
parsers.JSONParser
# 处理x-www-form-urlencoded数据,media_type = ‘application/x-www-form-urlencoded‘
parsers.FormParser
# 处理multipart/form-data数据,media_type = ‘multipart/form-data‘
parsers.MultiPartParser
# 处理所有数据,media_type = ‘*/*‘
parsers.FileUploadParser

如果我们在视图类中不指定需要使用的解析器,则默认会使用三种:

在APIView类中可以看到:

class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    ...
    ...

在DEFAULTS中找到 DEFAULT_PARSER_CLASSES :

‘DEFAULT_PARSER_CLASSES‘: [
    ‘rest_framework.parsers.JSONParser‘,
    ‘rest_framework.parsers.FormParser‘,
    ‘rest_framework.parsers.MultiPartParser‘
],

默认使用了JSONParser、FormParser和MultiPartParser三种解析器。

3.在视图类中指定可以使用的解析器

class LoginView(APIView):
    authentication_classes = []
    parser_classes = [parsers.JSONParser,parsers.FormParser]
    ...
    ...

我们可以在视图类中使用parser_classes列表来指定该视图类可以使用的解析器。

当然,我们也可以仿造JSONParser等解析器实现自己的解析器。

66

原文地址:https://www.cnblogs.com/leokale-zz/p/12238449.html

时间: 2024-08-01 09:26:36

[Python自学] restframework (5) (解析器)的相关文章

RestFramework之解析器源码

一,restframework中的解析器 在restframework中,默认可以解析JSONParser, FormParser, MultiPartParser(json数据, urlencode数据, 二进制文件类型数据(图片,视频等))这三种数据格式: RestFramework中,当我们使用CBV写视图函数,继承RestFramework中的APIView时,只要我们在自己写的CBV类中,定义了  parser_classes = [ ]这个属性,那么restframework就会根据

Python 之父的解析器系列之三:生成一个 PEG 解析器

原题 | Generating a PEG Parser 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众号作者) 声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议.为便于阅读,内容略有改动. 首发地址:https://mp.weixin.qq.com/s/ojSq6u9FC0xlBDncuoKczw 我已经在本系列第二篇文章中简述了解析器的基础结构,并展示了一个简单的手写解析器,根据承诺,

Python 之父的解析器系列之五:左递归 PEG 语法

原题 | Left-recursive PEG grammars 作者 | Guido van Rossum(Python之父) 译者 | 豌豆花下猫("Python猫"公众号作者) 声明 | 本翻译是出于交流学习的目的,基于 CC BY-NC-SA 4.0 授权协议.为便于阅读,内容略有改动. 我曾几次提及左递归是一块绊脚石,是时候去解决它了.基本的问题在于:使用递归下降解析器时,左递归会因堆栈溢出而导致程序终止. [这是我的 PEG 系列的第 5 部分.其它文章参见这个目录] 假设

Python之 迭代器 列表解析器

回顾: 1.动态语言 sys.getrefcount()  对象被引用的次数. 增加对象引用次数的场景:以赋值方式创建对象:对象作为某容器的元素时:被当做参数传递给函数时:为对象创建另外的变量名: 减少引用计数:引用此对象的某变量名被显式销毁 del x :给引用此对象的变量名重新赋值:从容器中移除对象,list.pop():容器本身被销毁: 完备和非完备遍历 Python迭代器 又称游标,是程序设计的软件设计模式,是一种可在容器物件上实现元素遍历的接口.是一种特殊的数据结构,在Python中,

Python自学之路——装饰器的秘密

先不管装饰器到底是个什么东东,让我们来聊一聊函数的几个点吧.我们知道,在python里,一切皆是对象,那么函数呢,当然也是对象,而且人家还是一级对象呐.既然是对象,那它就可以被赋值给变量,反之,通过变量也能调用函数.好,需特别注意的点来了,函数调用一定是函数名 + (),如果没有这个括号,函数是不会被调用的,它只能是表示内存里的一个地址,看下面 1 def happy(): 2 print('be happy') 3 print (happy) #并没有调用happy函数,只是打印了happy的

[Python自学] restframework

一.数据序列化的几种方式 在Django的视图函数中,我们从数据库中获取数据,由以下几种方式将其序列化成JSON数据: 1.方式一 class PublishView(View): def get(self, request): publish_list = list(Publish.objects.all().values()) return HttpResponse(json.dumps(publish_list)) 通过list强转的方式. 前台接收到的数据: [{"id": 1

DRF - 解析器组件

DRF之解析器组件 引入 Django RestFramework帮助我们实现了处理application/json协议请求的数据,另外,我们也提到,如果不使用DRF,直接从request.body里面拿到原始的客户端请求的字节数据,经过decode,然后json反序列化之后,也可以得到一个Python字典类型的数据. 但是,这种方式并不被推荐,因为已经有了非常优秀的第三方工具,那就是Django RestFramework的解析器组件. 解析器组件的使用 首先,来看看解析器组件的使用,稍后我们

爬虫笔记(四)------关于BeautifulSoup4解析器与编码

前言:本机环境配置:ubuntu 14.10,python 2.7,BeautifulSoup4 一.解析器概述 如同前几章笔记,当我们输入: soup=BeautifulSoup(response.body) 对网页进行析取时,并未规定解析器,此时使用的是python内部默认的解析器“html.parser”. 解析器是什么呢? BeautifulSoup做的工作就是对html标签进行解释和分类,不同的解析器对相同html标签会做出不同解释. 举个官方文档上的例子: BeautifulSoup

自定义频率组件,django自带的组件,解析器

自定义频率组件 from rest_framework.throttling import BaseThrottle, SimpleRateThrottle import time # 设置一分钟只能访问三次 class MyThrottle(BaseThrottle): visitor_dic = {} def __init__(self): self.history = None def allow_request(self, request, view): # META:请求所有的东西的字