在我的Tornado RESTful API中,我CollectionHandler
/{prefix}/items/
post()
item
来创建一个新的/items/{id}
,它将放在201
下。当我返回/items/{id}
状态代码时,我想要包含由ItemHandler
的{{1}}构建的get()
的正文,而不是重复其逻辑。这导致了一个带有大量参数的静态方法:
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))
我该如何清理它?我在考虑在内部为新创建的/items/{id}
执行HTTP请求并包含响应,但必须有更好的方法 - 它可能因为阻塞而无法工作......
答案 0 :(得分:1)
首先,我建议您考虑在CollectionHandler帖子中重定向()
self.redirect('/items/' + str(item.id))
但是我想你已经附加了201状态代码,因此重定向不适合你。
您是否尝试过使用这样的mixins?:
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))