Ich habe zahlreiche tornado.web.RequestHandler-Klassen, die autorisierten Zugriff mit id- und Zugriffsschlüssel-Secure-Cookies testen. Ich greife asynchron auf mongodb zu und verwende Inline-Callbacks mit gen.Task. Ich habe Schwierigkeiten herauszufinden, wie ich den wiederholten Code aufgrund seiner Asynchronität auslagern kann. Wie kann ich das tun?
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:
# in bson id Format konvertieren, um auf mongodb zuzugreifen
bson.objectid.ObjectId(id)
except:
# wenn keine gültige Objekt-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
# es folgt der eigentliche Geschäftscode
Ich würde gerne den obigen Code in eine Funktion auslagern, die möglicherweise einen HTTP-Statuscode zurückgibt.