0

私の Tornado RESTful API には、 の下に配置される新しい を作成するためのCollectionHandlerat/{prefix}/items/があります。ステータス コードを返すとき、ロジックを複製せずに、によって構築されたの本体を含めたいと考えています。これにより、多くのパラメーターを持つ静的メソッドが作成されました。post()item/items/{id}201/items/{id}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 に答える