Skip to content

Instantly share code, notes, and snippets.

@loretoparisi
Created October 25, 2019 10:55
Show Gist options
  • Save loretoparisi/6ecf0ab362fdb7c40cadf708dafa0277 to your computer and use it in GitHub Desktop.
Save loretoparisi/6ecf0ab362fdb7c40cadf708dafa0277 to your computer and use it in GitHub Desktop.
Tornado BaseHandler for IOLoop run in executor and error handling
class BaseHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def post_async(self, *args):
resp_dict = yield ioloop.IOLoop.current().run_in_executor(None, self.post_handler, args)
return resp_dict
@tornado.web.asynchronous
@tornado.gen.coroutine
def post(self, *args):
response = yield self.post_async(args)
self.set_header("Content-Type", "application/json; charset=UTF-8")
status_code = response.getField('status_code', 200)
self.set_status(status_code)
self.write(json.dumps(response.getData()))
self.finish()
@tornado.gen.coroutine
def get_async(self, *args):
resp_dict = yield ioloop.IOLoop.current().run_in_executor(None, self.get_handler, args)
return resp_dict
@tornado.web.asynchronous
@tornado.gen.coroutine
def get(self, *args):
response = yield self.get_async(args)
self.set_header("Content-Type", "application/json; charset=UTF-8")
status_code = response.getField('status_code', 200)
self.set_status(status_code)
self.write(json.dumps(response.getData()))
self.finish()
def write_error(self, status_code, **kwargs):
# logger
logger = MXMLogger.instance().get_logger()
self.set_header('Content-Type', 'application/json')
err = {}
if self.settings.get("serve_traceback") and "exc_info" in kwargs:
# in debug mode, try to send a traceback
lines = []
for line in traceback.format_exception(*kwargs["exc_info"]):
lines.append(line)
err = {
'code': status_code,
'message': self._reason,
'traceback': lines
}
else:
err = {
'code': status_code,
'message': self._reason
}
# format error response
response = ResponseTornado()
response.addHeader(status_code=err['code'] )
response.addError(code=err['code'], status=err['code'], hint='', description='', message=err['message'])
logger.error("error %d %s" % (err['code'], err['message']) )
self.set_status(status_code)
self.write(json.dumps(response.getData()))
class ErrorHandler(tornado.web.ErrorHandler, BaseHandler):
"""Generates an error response with status_code for all requests."""
def write_error(self, status_code, **kwargs):
# logger
logger = MXMLogger.instance().get_logger()
self.set_header('Content-Type', 'application/json')
err = {}
if self.settings.get("serve_traceback") and "exc_info" in kwargs:
# in debug mode, try to send a traceback
lines = []
for line in traceback.format_exception(*kwargs["exc_info"]):
lines.append(line)
err = {
'code': status_code,
'message': self._reason,
'traceback': lines
}
else:
err = {
'code': status_code,
'message': self._reason
}
# format error response
response = ResponseTornado()
response.addHeader(status_code=err['code'] )
response.addError(code=err['code'], status=err['code'], hint='', description='', message=err['message'])
logger.error("error %d %s" % (err['code'], err['message']) )
self.set_status(status_code)
self.write(json.dumps(response.getData()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment