我有许多 tornado.web.RequestHandler 类,它们使用 id 和访问密钥安全 cookie 测试授权访问。我使用 gen.Task 通过内联回调异步访问 mongodb。由于它的异步性,我无法找出一种方法来分解重复代码。我怎样才能做到这一点?
class MyHandler(RequestHandler):
@tornado.web.asynchronous
@gen.engine
def get(self):
id = self.get_secure_cookie('id', None)
accesskey = self.get_secure_cookie('accesskey', None)
if not id or not accesskey:
self.redirect('/a_public_area')
return
try:
# convert to bson id format to access mongodb
bson.objectid.ObjectId(id)
except:
# if not valid object id
self.redirect('/a_public_area')
return
found_id, error = yield gen.Task(asyncmong_client_inst.collection.find_one,
{'_id': id, 'accesskey': accesskey}, fields={'_id': 1})
if error['error']:
raise HTTPError(500)
return
if not found_id[0]:
self.redirect('/a_public_area')
return
# real business code follows
我想将上述因素纳入一个可能产生 HTTP 状态代码的函数中。