发布于 2015-09-13 08:16:57 | 291 次阅读 | 评论: 0 | 来源: PHPERZ
资源(Resource)指的是代码中映射各种数据的实体。可以是博文、评论以及其他任何数据。
(Wrongway吐槽:其实这一节是讲Handler的...)
下面,我们在handlers.py中创建一个简单的handler:
#!python from piston.handler import BaseHandler from myapp.models import Blogpost class BlogpostHandler(BaseHandler): allowed_methods = ('GET',) model = Blogpost def read(self, request, post_slug): ...
Piston通过handler将资源与models进行映射,这个过程中Piston做了很多繁重的幕后工作,为开发者节省了大量精力。
Resource必须是一个类,通常情况下,Resource要实现下列四个方法中的一个或多个:
read: 由 GET 动作调用,获取对象而不做数据修改(该方法是幂等的) create: 由 POST 动作调用,创建新对象(们)并返回该对象(们)(或是返回 rc.CREATED.) update: 由 PUT 动作调用,更新某个已存在的对象并返回该对象(或是返回 rc.ALL_OK.) delete: 由 DELETE 动作调用,删除某个已存的对象,只返回 rc.DELETED 。
除此之外,我们还可以定义其他我们所需的方法。只要在 fields 中填写方法名称,该方法就会被调用, 并在调用时自动传入 model 的实例做为参数。 该方法的返回值将用做该key(方法名称)的值,返回值不做限制,可以为任意类型。
NB: 上述自定义的 “resource methods” 应该被 @classmethod 修饰。因为使用这些自定义方法时Piston未必会对Handler进行实例化。 假设你已经定义了一个UserHandler类,并在该类中自定义了一个返回User对象的方法,在这种情况下,Piston是不会调用 UserHandler实例的自定义对象方法, 只会调用UserHander类的自定义的类方法。
一个handler即可以表示单独的一个对象,也可以表示多个对象的集合,因此我们可以在read()方法中分别处理这两种情况:
#!python from piston.handler import BaseHandler from myapp.models import Blogpost class BlogpostHandler(BaseHandler): allowed_methods = ('GET',) model = Blogpost def read(self, request, blogpost_id=None): """ Returns a single post if `blogpost_id` is given, otherwise a subset. """ base = Blogpost.objects if blogpost_id: return base.get(pk=blogpost_id) else: return base.all() # Or base.filter(...)