Django REST framework API 指南(7):解析
Django REST framework API 指南(1):请求
Django REST framework API 指南(2):响应
Django REST framework API 指南(3):视图
Django REST framework API 指南(4):通用视图
Django REST framework API 指南(5):视图集
Django REST framework API 指南(6):路由
Django REST framework API 指南(7):解析
官方原文链接
解析器
REST framework 包含许多内置的解析器类,允许接受各种媒体类型(media types)的请求。还支持自定义解析器,这使你可以灵活地设计 API 接受的媒体类型。
如何确定使用哪个解析器
视图的有效解析器集始终定义为类列表。当访问 request.data
时,REST framework 将检查传入请求的 Content-Type
,并确定使用哪个解析器来解析请求内容。
注意:在开发客户端应用程序时,请务必确保在 HTTP 请求中发送数据时设置了
Content-Type
。
如果你不设置 content type,大多数客户端将默认使用'application / x-www-form-urlencoded'
,这可能不是你想要的。 例如,如果你使用 jQuery 和.ajax()
方法发送json
数据,则应确保包含contentType:'application/json'
设置。
设置解析器
可以使用 DEFAULT_PARSER_CLASSES
设置默认的全局解析器。例如,以下设置将只允许带有 JSON
内容的请求,而不是默认的 JSON 或表单数据。
REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework.parsers.JSONParser',)
}
复制代码
还可以在基于类(APIView
)的视图上设置单个视图或视图集的解析器。
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIViewclass ExampleView(APIView):"""A view that can accept POST requests with JSON content."""parser_classes = (JSONParser,)def post(self, request, format=None):return Response({'received data': request.data})
复制代码
或者和 @api_view
装饰器一起使用。
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser@api_view(['POST'])
@parser_classes((JSONParser,))
def example_view(request, format=None):"""A view that can accept POST requests with JSON content."""return Response({'received data': request.data})
复制代码
API 参考
JSONParser
解析 JSON 请求内容。
.media_type: application/json
FormParser
解析 HTML 表单内容。request.data
是一个 QueryDict
字典,包含所有表单参数。
通常需要同时使用 FormParser
和 MultiPartParser
,以完全支持 HTML 表单数据。
.media_type: application/x-www-form-urlencoded
MultiPartParser
解析文件上传的 multipart HTML 表单内容。 request.data
是一个 QueryDict
(其中包含表单参数和文件)。
通常需要同时使用 FormParser
和 MultiPartParser
,以完全支持 HTML 表单数据。
.media_type: application/form-data
FileUploadParser
解析文件上传内容。 request.data
是一个 QueryDict
(只包含一个存有文件的 'file'
key)。
如果与 FileUploadParser
一起使用的视图是用 filename
URL 关键字参数调用的,那么该参数将用作文件名。
如果在没有 filename
URL 关键字参数的情况下调用,则客户端必须在 Content-Disposition
HTTP header 中设置文件名。例如 Content-Disposition: attachment; filename=upload.jpg
。
.media_type: */*
请注意:
FileUploadParser
用于本地客户端,可以将文件作为原始数据请求上传。对于基于 Web 的上传,或者对于具有分段上传支持的本地客户端,您应该使用MultiPartParser
解析器。- 由于此解析器的
media_type
与任何 content type 都匹配,因此FileUploadParser
通常应该是在 API 视图上设置的唯一解析器。 FileUploadParser
遵循 Django 的标准FILE_UPLOAD_HANDLERS
设置和request.upload_handlers
属性。有关更多详细信息,请参阅 Django 文档。
基本用法示例:
# views.py
class FileUploadView(views.APIView):parser_classes = (FileUploadParser,)def put(self, request, filename, format=None):file_obj = request.data['file']# ...# do some stuff with uploaded file# ...return Response(status=204)# urls.py
urlpatterns = [# ...url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
]
复制代码
自定义解析
要实现自定义解析器,应该继承 BaseParser
,设置 .media_type
属性并实现 .parse(self,stream,media_type,parser_context)
方法。
该方法应该返回将用于填充 request.data
属性的数据。
传递给 .parse()
的参数是:
stream
表示请求正文的流式对象。
media_type
可选。如果提供,则这是传入请求内容的 media type。
根据请求的 Content-Type:
header,可以比渲染器的 media_type
属性更具体,并且可能包含 media type 参数。比如 "text/plain; charset=utf-8"
。
parser_context
可选。如果提供,则该参数将是一个包含解析请求内容可能需要的任何其他上下文的字典。
默认情况下,这将包括以下 key:view
,request
,args
,kwargs
。
举个栗子
以下是一个示例纯文本解析器,它将使用表示请求正文的字符串填充 request.data
属性。
class PlainTextParser(BaseParser):"""Plain text parser."""media_type = 'text/plain'def parse(self, stream, media_type=None, parser_context=None):"""Simply return a string representing the body of the request."""return stream.read()
复制代码
第三方包
以下是可用的第三方包。
YAML
REST framework YAML 提供 YAML 解析和渲染支持。它以前直接包含在 REST framework 包中,现在作为第三方包。
安装和配置
使用pip安装。
$ pip install djangorestframework-yaml
复制代码
修改 REST framework settings。
REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework_yaml.parsers.YAMLParser',),'DEFAULT_RENDERER_CLASSES': ('rest_framework_yaml.renderers.YAMLRenderer',),
}
复制代码
XML
REST Framework XML 提供了一种简单的非正式 XML 格式。它以前直接包含在 REST framework 包中,现在作为第三方包。
安装和配置
使用pip安装。
$ pip install djangorestframework-xml
复制代码
修改 REST framework settings。
REST_FRAMEWORK = {'DEFAULT_PARSER_CLASSES': ('rest_framework_xml.parsers.XMLParser',),'DEFAULT_RENDERER_CLASSES': ('rest_framework_xml.renderers.XMLRenderer',),
}
复制代码
MessagePack
CamelCase JSON
友情提示
配合源码阅读效果更佳哦
Django REST framework API 指南(7):解析相关推荐
- Django REST framework API 指南(2):响应
Django REST framework API 指南(1):请求 Django REST framework API 指南(2):响应 Django REST framework API 指南(3 ...
- Django REST framework API 指南(12):验证器
官方原文链接 本系列文章 github 地址 转载请注明出处 验证器 大多数情况下,您在 REST framework 中处理验证时,只需依赖默认的字段验证,或者在序列化类或字段类上编写明确的验证方法 ...
- Django REST framework API 指南(11):序列化·关系
官方原文链接 本系列文章 github 地址 转载请注明出处 Serializer 关系 关系字段用于表示模型关系. 它们可以应用于 ForeignKey,ManyToManyField 和 OneT ...
- Django REST framework API 指南(25):状态码
官方原文链接 本系列文章 github 地址 转载请注明出处 状态码 不建议在你的响应中使用裸露(直接使用数字)的状态码. REST framework 包含一组命名常量,你可以使用它们使代码更加清晰 ...
- Django REST framework API开发
REST 介绍 RESTful API 设计 实现API的两种方式 FBV 视图函数 urlpatterns = [url(r'^user/$', views.user),url(r'^user/ad ...
- Django REST Framework API Guide 01
之前按照REST Framework官方文档提供的简介写了一系列的简单的介绍博客,说白了就是翻译了一下简介,而且翻译的很烂.到真正的生产时,就会发现很鸡肋,连熟悉大概知道rest framework都 ...
- Django REST Framework API Guide 02
本节大纲 1.Generic Views 2.ViewSets 1.Generic Views CBV的主要的一个优点就是极大的允许了对于代码的从用.自然,rest framework取其优势,提供 ...
- Django REST Framework API Guide 07
本节大纲 1.Permissions 2.Throttling Permissions 权限是用来授权或者拒绝用户访问API的不同部分的不同的类的.基础的权限划分 1.IsAuthenticated ...
- Django REST framework学习笔记
文章目录 1. API接口开发 1.1 获取数据的接口 1.2 添加数据的接口 1.3 更新数据的接口 1.4 删除数据的接口 2. API字段的定制 2.1 别名字段 2.2 字段格式化 2.3 字 ...
- django restful 请求_利用 Django REST framework 构建 RESTful Web API
利用 Django REST framework 构建 RESTful Web API 终于到了动手操作的环节啦,这一节,我们以师生管理系统为例,带领大家搭建一套 framework Web API. ...
最新文章
- log4j 日志限制大小 拆分成30个 不按日期分日志 按大小拆分 按日期产生...
- 菜鸟学python 哪吒_Python 学习之路 (前言)
- Linux学习笔记05
- 转一个后缀数组的简单总结:
- Qt工作笔记-使用hiredis连接及查询Redis
- iPhone 13的新对手?小米历史上最好看的手机即将发布
- SVN如何迁移到Git?
- 设计模式:模板(Template)模式
- HTML5期末大作业:腾讯游戏网站设计——腾讯游戏官网(13页) HTML+CSS+JavaScript web网页设计与开发
- logistic回归分析优点_逻辑回归算法的优缺点
- ubuntu中查看IP地址命令
- gnu开源代码_GNU Health扩展了对Raspberry Pi的支持,Megadeth的吉他手使用了开源原则,以及更多的开源新闻。...
- Python20190206 解不定方程并绘制散点图标记解
- armbian清理_N1的ArmbianOpenMediaVault笔记
- 写给夏燕第十一个男人
- Markdown/LaTeX数学符号、公式大全(一)
- 想使用hexo(个人博客的方案) Next(主题)搭建一个个人的照片墙
- python半径为2.11的圆球的体积_Python科学计算神器之Numpy-2
- 机器学习理论: PAC学习
- 九问 Gopher China 2020 讲师之毛康力:从 Go 1.0 使用至今的鲜肉老司机
热门文章
- Atitti 编程语言高级 api 与高级知识 堆栈api 异常api Meta anno注解元数据api Ref 反射api Database meta api 字节码库如果你正在编写一个框架或者
- atitit.api设计 方法 指南 手册 v2 q929.docx
- paip.互联网产品要成功的要素
- paip.重装系统需要备份的资料总结..v2.0 cad
- paip.python错误解决5
- Rust: match 与ref
- Rust: ,clone,Box,Arc 的address
- 【路径规划】基于matlab灰狼算法求解机器人栅格地图路径规划问题【含Matlab源码 1761期】
- 【语音隐写】基于matlab GUI LSB语音信号数字水印嵌入提取(带面板)【含Matlab源码 1676期】
- 2021年全国研究生数学建模指导