django rest framework - 数据解析
2015-01-15 00:00
162 查看
摘要: parser.py是rest-framework的数据解析模块, 它能够解析大多数的数据格式(json,xml,yaml)所有数据解析的类都是BaseParser的子类。
class BaseParser(object):"""All parsers should extend `BaseParser`, specifying a `media_type`attribute, and overriding the `.parse()` method."""media_type = Nonedef parse(self, stream, media_type=None, parser_context=None):"""Given a stream to read from, return the parsed representation.Should return parsed data, or a `DataAndFiles` object consisting of theparsed data and files."""raise NotImplementedError(".parse() must be overridden.")从parse方法的注释,也可以看出parse返回的可能是解析后的数据,也有可能是DataAndFiles对象。parse方法中的参数:stream即为要解析的数据,parse_context为需要解析时需要提供的配置,
class DataAndFiles(object):def __init__(self, data, files):self.data = dataself.files = files可以看出DataAndFiles仅仅是data和files的集合。只有MultiPartParser和FileUploadParser才返回DataAndFiles对象。parser.py一共有以下多种类,JSONParser,YAMLParser,FormParser,MultiPartParser,XMLParser,FileUploadParser。首先看JSONParser的定义:
class JSONParser(BaseParser):"""Parses JSON-serialized data."""media_type = 'application/json'def parse(self, stream, media_type=None, parser_context=None):"""Parses the incoming bytestream as JSON and returns the resulting data."""parser_context = parser_context or {}encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)try:data = stream.read().decode(encoding)return json.loads(data)except ValueError as exc:raise ParseError('JSON parse error - %s' % six.text_type(exc))通过parse_context获取encoding,然后解码stream,利用json库中的loads方法解析并返回数据。其实YAMLParser和XMLParser,是跟JSONParser的步骤一样的,只不过调用不同的库来解析数据。再来看一下通用的FormPaser,用于解析'application/x-www-form-urlencoded'类型的数据,这种数据是POST方法提交数据,默认的格式。它只不过直接被实例化了QueryDict对象。
class FormParser(BaseParser):"""Parser for form data."""media_type = 'application/x-www-form-urlencoded'def parse(self, stream, media_type=None, parser_context=None):"""Parses the incoming bytestream as a URL encoded form,and returns the resulting QueryDict."""parser_context = parser_context or {}encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)data = QueryDict(stream.read(), encoding=encoding)return data
相关文章推荐
- django rest framework - 数据解析
- Django REST framework 返回json 数据以及 admin 分页返回数据方法
- django rest framework 应该有多个数据却显示null
- django rest framework 数据的查找、过滤、排序的示例
- Django REST framework 嵌套关系的数据保存(Writable nested serializers)
- JavaScript 解析 Django Python 生成的 datetime 数据 时区问题解决
- 解析Oracle各种数据类型
- C++中类的静态数据成员函数解析
- 有用的 SQL Server数据汇总完全解析
- 数据恢复全解析
- Oracle数据库数据锁定机制全面解析
- 数据恢复全解析 推荐
- 让UpdatePanel支持文件上传(4):数据传输与解析机制
- 用NetPDL解析网络数据
- 跟踪commnityServer系列一:CS与petshop中数据访问的解析
- HTTP数据包头解析---之温故而知新!
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据解析
- 数据备份与数据容灾全解析(图)
- 在JSP开发中使用jdom解析临时存放数据的XML文件