0

在我的 Tornado RESTful API 中,我有一个CollectionHandlerat/{prefix}/items/和 apost()来创建一个新item的,它将放在/items/{id}. 当我返回201状态码时,我想包含由's/items/{id}构造的 that 的主体,而不是重复其逻辑。这导致了一个带有很多参数的静态方法:ItemHandlerget()

class CollectionHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.service = Service()

    def post(self, prefix):
        do_stuff(prefix)
        item, item_url = create_item()
        self.set_status(201)
        self.set_header('Location', item_url)
        self.write(ItemHandler.do_get(self.service, item_url, item.id))

class ItemHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.service = Service()

    @staticmethod
    def do_get(service, item_url, item_id):
        item = service.get_item(item_id)
        if not item: raise tornado.web.HTTPError(404)
        response = construct_response(item_url, item)
        return response

    def get(self, item_id):
        item_url = get_url(self.request)
        self.write(ItemHandler.do_get(self.service, item_url, item_id))

我怎样才能清理这个?我正在考虑在内部对新创建的内容进行 HTTP 请求/items/{id}并包含响应,但必须有一些更好的方法——它甚至可能因为阻塞而无法工作......

4

1 回答 1

1

好吧,首先我建议您考虑在 CollectionHandler post() 中进行重定向

self.redirect('/items/' + str(item.id))

但是我猜您已附加到您的 201 状态代码,因此重定向对您不起作用。

您是否尝试过使用这样的 mixin?

class MixIt():
    def __init__(self):
        self.service = Service()

    def do_get(item_url, item_id):
        item = self.service.get_item(item_id)
        if not item: raise tornado.web.HTTPError(404)
        response = construct_response(item_url, item)
        return response

class CollectionHandler(MixIt, tornado.web.RequestHandler):
    def post(self, prefix):
        do_stuff(prefix)
        item, item_url = create_item()
        self.set_status(201)
        self.set_header('Location', item_url)
        self.write(self.do_get(item_url, item.id))

class ItemHandler(MixIt, tornado.web.RequestHandler):
    def get(self, item_id):
        item_url = get_url(self.request)
        self.write(self.do_get(item_url, item_id))
于 2013-09-23T16:35:44.887 回答