解析器

机交互的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# 替换文件名的字符

    https://www.cnblogs.com/lindexi/p/8970466.html

  2. Python3.5 配置MySql数据库连接

    #!coding:utf-8 import pymysql ''' Python3之后不再支持MySQLdb的方式进行访问mysql数据库: 可以采用pymysql的方式 连接方式: 1.导包 imp ...

  3. 自动化将 word 转为 pdf,再将pdf转为图片!

    参考: https://blog.csdn.net/ynyn2013/article/details/49120731 https://www.jianshu.com/p/f57cc64b9f5e 一 ...

  4. SSH 密钥认证

    目录 SSH协议概述 SSH 和 Telnet 的区别 SSH 相关命令 SSH 验证方式 基于密钥的安全认证 SSH 优化 expect 脚本免交互登录 sshpass 免交互登录 SSH协议概述 ...

  5. kubernetes进阶(三)服务发现-coredns

    服务发现,说白了就是服务(应用)之间相互定位的过程. 服务发现需要解决的问题: 1.服务动态性强--容器在k8s中ip变化或迁移 2.更新发布频繁--版本迭代快 3.支持自动伸缩--大促或流量高峰 我 ...

  6. codeforces 1042D - Petya and Array【树状数组+离散化】

    题目:戳这里 题意:有n个数,问有多少个区间满足[L,R]内的和小于t. 解题思路: [L,R]内的和小于t等价于sum[R]-sum[L-1]<t,将sum[L-1]左移,可以看出R与L的关系 ...

  7. 833A The Meaningless Game

    A. The Meaningless Game time limit per test 1 second memory limit per test 256 megabytes input stand ...

  8. confirm() :带有指定消息和 OK 及取消按钮的对话框

    定义和用法 confirm() 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框. 语法 confirm(message) 参数描述 message 要在 window 上弹出的对话框中显示的 ...

  9. hdu5693D++游戏 区间DP-暴力递归

    主要的收获是..如何优化你递推式里面不必要的决策 之前的代码 这个代码在HDU超时了,这就对了..这个复杂度爆炸.. 但是这个思路非常地耿直..那就是只需要暴力枚举删两个和删三个的情况,于是就非常耿直 ...

  10. DOM型XSS

    打开漏洞页面,随便输入点东西,发现没有啥东西. 但是我们发现我们输入的11,在面的herf 中 看到这儿就很简单了,我们只需要闭合一下,就可以构造出我们的payload了. '><img ...