解析器

机交互的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. C# List.Sort与IComparer接口及Comparison委托应用于集合排序

    C#里List.Sort的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  2. WSL (Windows Subsystem for Linux) 的 VSLAM (Visual Simultaneous Localization and Mapping) 道路

    WSL 的 VSLAM 道路 以 Windows Subsystem for Linux 闯入 Visual Simultaneous Localization and Mapping 世界的艰难道路 ...

  3. Redis 持久化(Persistence)

    作为内存数据库,Redis 依然提供了持久化机制,其主要目的有两个: 安全:保证进程崩溃后数据不会丢失 备份:方便数据迁移与快速恢复 Redis 同时提供两种持久化机制: RDB 快照:数据库在某个时 ...

  4. python函数传参

    之前一直没有注意过该问题,在leetcode144中写递归发现该问题,不知道递归函数传参是指针还是引用. 参考:http://c.biancheng.net/view/2258.html 如果是不可变 ...

  5. leetcode31 下一个排列 字典序

    数字的字典序就是比大小 先想几个例子  123_>132  1243-> 1324 ,12453-> 12534 1.不可排的序列就是降序序列 2.两个相同长度的串比大小,前面相同, ...

  6. SPOJ SUBST1 New Distinct Substrings(后缀数组 本质不同子串个数)题解

    题意: 问给定串有多少本质不同的子串? 思路: 子串必是某一后缀的前缀,假如是某一后缀\(sa[k]\),那么会有\(n - sa[k] + 1\)个前缀,但是其中有\(height[k]\)个和上一 ...

  7. mysql(一)--mysql架构和执行流程

    1. 一条查询 SQL 语句是如何执行的? 我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接.   1.1. 通信协议 首先,MySQL 必须要运行一个服务,监听默认的 3306 ...

  8. POJ 2923 Relocation(状压DP)题解

    题意:有2辆车运货,每次同时出发,n(<10),各自装货容量c1 c2,问最少运几次运完. 思路:n比较小,打表打出所有能运的组合方式,用背包求出是否能一次运走.然后状压DP运的顺序. 代码: ...

  9. DRM & 音视频 & 防盗链

    DRM & 音视频 & 防盗链 DRM Digital Rights Management / 数字版权管理 https://en.wikipedia.org/wiki/Digital ...

  10. js & void() & void(0)

    js & void() & void(0) https://www.runoob.com/js/js-void.html void() <a href="javascr ...