Piston为何要从之前的handler中获取fields信息?

我们创建某个绑定model的handler时,Piston会自动通过metaclass对handler进行注册。接下来, 如果其他hander返回该model的一个对象,且这个handler本身并没有定义fields,那么Piston就会使用之前捆绑该model的handler中的fields来提供内容。

举个例子,下面这个handler::

  1. #!python
  2. class FooHandler(BaseHandler):
  3. model = Foo
  4. fields= ('id', 'title')

绑定了 ‘Foo’ 。接下来::

  1. #!python
  2. def read(...):
  3. f = Foo.objects.get(pk=1)
  4. return { 'foo': f }

Piston将返回’f’的’id’和’title’字段。但这两个字段并不是我们想要的,就可以象下面这样定义字段::

  1. #!python
  2. class OtherHandler(BaseHandler):
  3. fields = ('something', ('foo', ('title', 'content')))
  4. def read(...):
  5. f = Foo.objects.get(pk=1)
  6. return { 'foo': f }

这样,Piston会返回’f’的’title’和’content’,而不是之前的’id’和’title’。关于fields内嵌的深度,Piston是不做限制的。

如果我们想重置metaclass和内嵌的fields,只要用 (‘foo’, ()) 就可以一次取出model实例的所有字段内容。

为什么即便我明确指定了id,但是Piston仍然会忽略’id’?

NB: 在新版本的Piston中, fields 指定的字段包含信息会覆盖 exclude 中的字段排除信息。

Piston排除models的ID,其充分理由是 通常情况下 ID应该做为内部非公开属性,不应该暴露给用户。 在 必须 包含’id’的情况下,我们可以重设’exclude’来实现::

  1. #!python
  2. class SomeHandler(BaseHandler):
  3. exclude = ()

如果想覆写默认的全局设置,可以用下列的代码::

  1. #!python
  2. from piston.handler import BaseHandler, AnonymousBaseHandler
  3. BaseHandler.fields = AnonymousBaseHandler.fields = ()

什么是URI模板?

http://bitworking.org/projects/URI-Templates/] 定义了如何构造访问WEB资源的URL。根据下列URL模板:

http://www.yourproject.com/api/post/{id}/

以及变量值

id := 1

所得到的网址就是:

http://www.yourproject.com/api/post/1/

提示和技巧

如 Stephan Preeker (http://groups.google.com/group/django-piston/browse_thread/thread/1ca2fd1c89f3df4e) 中提到的, 我们可以在已认证的handler中调用匿名handler,如下::

  1. #!python
  2. class handler( .. )
  3. def read(self, request, id):
  4. self.anonymous.read(id=id)

上述代码能够工作,是因为 self.anonymous 指向匿名handler,因此我们可以直接引用匿名方法。

上报错误

http://bitbucket.org/jespern/django-piston/issues/

哪些项目在使用Piston?

Piston最初在Bitbucket内部使用,随后将其开源。Bitbucket的API已经实现版本化,大家可以在 http://api.bitbucket.org/ 找到最新版本。

如果您感觉Piston还不错,不妨将您应用Piston的网站做为案例添加进来

  • http://dpaste.de/ 使用piston提供简单的API,用于从桌面或TextMate粘贴代码片段。

  • http://www.bachigua.com/ 使用Piston提供一组API,用于实现类似 “iGoogle” 的小组件门户 (用Django写的)

  • http://urbanairship.com/ 将Piston用于它们的API,最初是为移动设备提供访问(比如iphone推送通知以及app内置付款)。