解析器

机交互的Web服务更倾向于使用结构化的格式比发送数据格式编码的,因为他们发送比简单的形式更复杂的数据

-马尔科姆Tredinnick,Django开发组

REST框架包含许多内置的解析器类,允许您接受各种媒体类型的请求。也有定义自己的自定义解析器,它给你设计的媒体类型,你的API接受的灵活性支持。

分析器是如何确定的

该组的视图有效的解析器总是被定义为类的列表。当 request.data被访问时,REST框架将检查Content-Type对传入的请求头,并确定要使用到解析请求其内容解析器。


:在开发客户端应用程序永远记住,以确保你设置Content-Type一个HTTP请求发送数据时头。

如果不设置内容类型,大多数客户将默认使用'application/x-www-form-urlencoded',这可能不是你想要的。

举个例子,如果您要发送json使用jQuery与编码数据。阿贾克斯()方法,你应该确保包括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 APIView class 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_typeapplication/json

FormParser

解析HTML表单的内容。 request.data将与被填充QueryDict的数据。

您通常会希望同时使用FormParser,并MultiPartParser为了共同全力支持HTML表单数据。

.media_typeapplication/x-www-form-urlencoded

MultiPartParser

解析多HTML表单内容,支持文件上传。双方request.data将填充用QueryDict

您通常会希望同时使用FormParser,并MultiPartParser为了共同全力支持HTML表单数据。

.media_typemultipart/form-data

FileUploadParser

解析原始文件上传的内容。该request.data属性将与单个密钥字典'file'包含上传的文件。

如果所使用的视图FileUploadParser是带一个filenameURL关键字参数,则该参数将被用作文件名。

如果它被称为没有一个filenameURL关键字参数,则客户端必须设置文件名Content-DispositionHTTP标头。例如Content-Disposition: attachment; filename=upload.jpg

.media_type*/*

笔记:
  • FileUploadParser是与本地客户端的使用,可以将文件上传的原始数据请求。对于基于网络的上传,或与多上传支持本地客户端,您应该使用MultiPartParser来代替。
  • 由于该解析器的media_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()如下:

代表该请求的主体中的流状物体。

媒体类型

可选的。如果提供的话,这是媒体类型的传入请求的内容。

根据请求的Content-Type:报头,这可能比渲染器的更具体的media_type属性,并且可包括媒体类型参数。例如"text/plain; charset=utf-8"

parser_context

可选的。如果提供,该参数将是包含可能需要解析请求内容的任何附加的上下文中的字典。

默认情况下,这将包括以下键:viewrequestargskwargs

以下是一个例子明文解析器将填充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()

第三方软件包

下面的第三方软件包也可提供。

Yamla

REST框架YAML提供YAML解析和渲染的支持。这是以前直接计入REST框架封装,现在改为支持作为第三方包。

安装和配置

安装使用PIP。

$ pip install djangorestframework-yaml

修改您的REST架构设置。

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework_yaml.parsers.YAMLParser',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework_yaml.renderers.YAMLRenderer',
],
}

XML

REST框架XML提供了一个简单的非正式的XML格式。这是以前直接计入REST框架封装,现在改为支持作为第三方包。

安装和配置

安装使用PIP。

$ pip install djangorestframework-xml

修改您的REST架构设置。

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework_xml.parsers.XMLParser',
],
'DEFAULT_RENDERER_CLASSES': [
'rest_framework_xml.renderers.XMLRenderer',
],
}

MessagePack

MessagePack是一种快速,高效的二进制序列化格式。 胡安里亚萨保持djangorestframework-msgpack包,它提供REST框架MessagePack渲染器和分析器支持。

驼峰JSON

djangorestframework-骆驼情况下提供骆驼情况下JSON渲染器和解析器REST框架。这允许串行器使用Python风格的下划线字段名,但API,如JavaScript式驼峰字段名中暴露出来。这是维护维塔利Babiy

rest framework parsers的更多相关文章

  1. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  2. django rest framework 入门

    django rest framework 入门1-序列化 Serialization 分类: Python 2013-01-22 22:24 11528人阅读 评论(0) 收藏 举报 djangop ...

  3. .net Framework Class Library(FCL)

    from:http://msdn.microsoft.com/en-us/library/ms229335.aspx 我们平时在VS.net里引用的那些类库就是从这里来的 The .NET Frame ...

  4. Django REST framework 中文教程1:序列化

    建立环境 在我们做任何事情之前,我们将使用virtualenv创建一个新的虚拟环境.这将确保我们的包配置与我们正在开展的任何其他项目保持良好的隔离. virtualenv envsource env/ ...

  5. 源码剖析Django REST framework的请求生命周期

    学习Django的时候知道,在Django请求的生命周期中,请求经过WSGI和中间件到达路由,不管是FBV还是CBV都会先执行View视图函数中的dispatch方法 REST framework是基 ...

  6. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  7. Django REST framework+Vue 打造生鲜超市(四)

    五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...

  8. Python Django rest framework

    本节内容 Django rest framework 安装 Django rest framwwork 环境配置 简单举例说明 Django中使用 rest framework 1.1 安装 Djan ...

  9. Django rest framework(7)----分页

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

随机推荐

  1. 通过k8s部署dubbo微服务并接入ELK架构

    需要这样一套日志收集.分析的系统: 收集 -- 能够采集多种来源的日志数据 (流式日志收集器) 传输 -- 能够稳定的把日志数据传输到中央系统 (消息队列) 存储 -- 可以将日志以结构化数据的形式存 ...

  2. markdown & git diff

    markdown & git diff "dependencies": { "core-js": "3.6.5", "el ...

  3. 在线可视化设计网站 & 在线编辑器

    在线可视化设计网站 在线编辑器:海报编辑器.H5 编辑器.视频编辑器.音频编辑器.抠图编辑器 在线 拖拽 可视化 编辑器 Canvas WebGL Canva With Canva, anyone c ...

  4. VS Code All in One

    VS Code All in One Visual Studio Code All in One https://github.com/xgqfrms/vscode/ VS Code Shift + ...

  5. JavaScript 如何使用 setTimeout 实现 setInterval

    JavaScript 如何使用 setTimeout 实现 setInterval website multi content page setIntervalSimulator "use ...

  6. GitHub 500 error

    GitHub 500 error 无法访问了, GitHub 挂了又! error reports Downdetector Github down? Current service status a ...

  7. taro 禁用滚动事件

    taro 禁用滚动事件 禁止 Modal 蒙层下面的页面的内容跟随滚动 https://github.com/NervJS/taro/issues/3980 https://github.com/Ne ...

  8. qt 移动窗口MoveWindow

    RECT r; GetWindowRect(this->gameHwnd, &r); // 获取窗口的宽度和高度 int nWidth = r.right - r.left; int n ...

  9. NGK Global莫斯科路演:关注内存暴涨和Defi新项目-Baccarat

    此次路演由莫斯科演讲师Andrew首先致辞.首先安德鲁回顾了NGK近些年发展的整体情况,表示,NGK技术团队一直在认真的做事并将更加注重技术方案的改进,为行业提供更好的技术解决方案是NGK的愿景,NG ...

  10. django学习-9.windows系统安装mysql8教程

    1.前言 mysql是最流行的关系型数据库管理系统之一,我们可以在本地windows环境下搭建一个mysql的环境,便于学习. 当前我采取的搭配是: windows7(window8和window10 ...