你如何使用python

时间:2015-05-08 13:21:24

标签: python rest

我正在尝试使用python来创建rest API。作为一个框架,我使用烧瓶,但我没有使用烧瓶,因为有一件事它不遵循DRY原则(恕我直言)。

我们举个例子。

假设我有收集资源。

产品 - >产品 - >评论 - >评论

所以链接将是

/products/
/products/id/
/products/id/reviews
/products/id/reviews/id

所以在烧瓶中我需要实际复制/产品/链接4次。 Flask-restful并不反映存在资源层次结构。我制作了自己的代码来做到这一点。

class ResourceInterface(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def get_path(self):
        pass

    @abstractmethod
    def set_path(self, path):
        pass

    @abstractmethod
    def on_get(self, *args, **kwargs):
        pass

    @abstractmethod
    def on_post(self, *args, **kwargs):
        pass

    @abstractmethod
    def on_delete(self):
        pass

    @abstractmethod
    def on_put(self):
        pass

    @abstractmethod
    def do_put(self):
        pass

    @abstractmethod
    def do_post(self, *args, **kwargs):
        pass

    @abstractmethod
    def do_get(self, *args, **kwargs):
        pass

    @abstractmethod
    def do_delete(self, *args, **kwargs):
        pass


class BaseResource(ResourceInterface):
    __metaclass__ = ABCMeta

    def __init__(self, repository, entity_serializer, path=None):
        self.entity_serializer = entity_serializer
        self.repository = repository
        self.path = None
        self.set_path(path)
        self.pickler = Pickler(unpicklable=False)

    def on_put(self):
        pickled_output = self.pickler.flatten(self.do_put())
        return jsonpickle.json.encode(pickled_output)

    def on_post(self, *args, **kwargs):
        pickled_output = self.pickler.flatten(self.do_post(*args, **kwargs))
        return jsonpickle.json.encode(pickled_output)

    def on_get(self, *args, **kwargs):
        try:
            pickled_output = self.pickler.flatten(self.do_get(*args, **kwargs))
            fields = request.args.get('fields')
            if fields:
                for field in pickled_output.keys():
                    if field not in fields:
                        del pickled_output[field]
            return jsonpickle.json.encode(pickled_output)
        except ResourceNotFoundError as e:
            return str(e), 404

    def on_delete(self, *args, **kwargs):
        pickled_output = self.pickler.flatten(self.do_delete(*args, **kwargs))
        return jsonpickle.json.encode(pickled_output)

    def get_path(self):
        return self.path

    def set_path(self, path):
        self.path = path

这是我的代码的一部分。我认为它主要说明了一切。

现在的问题是我不明白处理大型集合的正确方法是什么。因此,假设客户不希望产品的评论数据,因为它太大了。

我的代码是使用'fields'查询字符串处理它,因此客户端可以说出他想要的字段。但这只适用于一个层次结构。

当客户询问/ products /并且不希望产品在响应中有评论时该怎么办?我的具体答案是我可以检查响应字典层次结构的所有级别(使用dfs或bfs)并删除不在'fields'查询字符串中的字段,但这不是一般答案,因为字典键中可能存在名称冲突在不同的层次。

REST是如何处理的?如何在python中实现它?

也许我应该在所有集合中使用游标并且总是返回被光标的集合并忘记'fields'查询字符串?

或者可能需要一些不同的类层次结构?像CollectionResource,ItemResource等?

0 个答案:

没有答案