发布于 2015-09-13 08:05:39 | 258 次阅读 | 评论: 0 | 来源: PHPERZ
Piston运行在HTTP协议上,对于post的数据处理得很好,对于其他格式(JSON或YAML)的数据也处理得不错。
Piston既能接收链值对数据,也很容易接收结构化数据。 Piston会尝试通过一组”loader”来反序列化传入的非form数据,这些”loader”取决于客户端指定的内容类型(Content-type)。
举个例子,如果我们给一个handler发送JSON数据,JSON内容类型(Content-Type)是 “application/json” ,Piston会做下面两件事情:
# 将反序列化后的数据存放在 request.data 中 # 将 request.content_type 设为 application/json 。对于form提交的数据而言,request.content_type 则总是 None.
可以如下这般使用 (查看 testapp/handlers.py):
#!python def create(self, request): if request.content_type: data = request.data em = self.model(title=data['title'], content=data['content']) em.save() for comment in data['comments']: Comment(parent=em, content=comment['content']).save() return rc.CREATED else: super(ExpressiveTestModel, self).create(request)
如果我们传送下列JSON数据,也可以被很好的处理:
#!python {"content": "test", "comments": [{"content": "test1"}, {"content": "test2"}], "title": "test"}
handler接收的任何数据都会被正常的反序列化,所以只要内容一致,无论格式是YAML还是XML,handler都能正常处理。
如果handler不接受客户端发送的数据(可能需要其他格式),可以用 utils.require_mime 装饰器来指定某种数据类型来解决这个问题。
该装饰器可以接收四种数据格式,以其短语名称来指定,分别是 ‘json’, ‘yaml’, ‘xml’ 和 ‘pickle’ 。
比如:
#!python class SomeHandler(BaseHandler): @require_mime('json', 'yaml') def create(... @require_extended def update(...