发布于 2015-09-13 08:02:34 | 400 次阅读 | 评论: 0 | 来源: PHPERZ
发射器(Emitters) 表示输出的数据类型,可以是 YAML, JSON, XML, Pickle 或 Django ,分别对应 emitters.py 中的 XMLEmitter, JSONEmitter, YAMLEmitter, PickleEmitter 和 DjangoEmitter 。
编写自己的emitters也很容易,要做的仅仅是创建一个继承 Emitter 的派生类,然后在其中创建 render 方法。 render方法接收一个 ‘request’ 参数,该参数是一个请求(request)对象的拷贝。 多了解一下request.GET是很有必要的。 (比如定义回调,JSON的输出)
要将数据进行序列化/渲染,需要调用 self.construct() ,该方法始终返回一个数据字典,我们就可以对字典做任何想做的操作,再将其返回(返回值须是unicode字符串)。
NB: 可以用 Emitter.register 函式注册Emitters,同样也可以用 Emitter.unregister 函式来移除注册(假使你想移除一个内置emitter)。
内置的emitter注册:
#!python class JSONEmitter(Emitter): ... Emitter.register('json', JSONEmitter, 'application/json; charset=utf-8')
自定义emitter时,可以引入Emitter模块并调用 ‘register’ 对其注册,从而使自定义的emitter生效。 也可以利用同名数据类型(即传入的第一个参数)来覆写内置或是已存在的emitters。
上述实践,使得Piston添加其他形式的Emitter扩展变得非常容易,比如protocal buffers或是CSV。
可 以通过 ‘?format=’ GET参数(例如 ‘/api/blogposts/?format=yaml’)为Emitter设置格式。不过新版本的Piston中,我们可以在URL映射中配置 ‘emitter_format’ 关键字参数来设置Emitters(与’format’关键字并不冲突),如下:
#!python urlpatterns = patterns('', url(r'^blogposts(?P<emitter_format>.+)$', ...), )
这样,/blogposts.json 就会使用 JSON emitter。
此外,我们还可以在URL映射中直接设置关键字参数来指定emitter格式:
#!python urlpatterns = patterns('', url(r'^blogposts$', resource_here, { 'emitter_format': 'json' }), )