我正在尝试使用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等?