Python tornado 用 finish() 停止执行
Python tornado stop execution with finish()
我对 tornado 比较陌生,我试图在条件通过时停止执行某个方法,否则它应该继续执行下一行代码(类似于 return)
这是我卡住的代码部分,
class PostMatchHandler(BaseRequestHandler):
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
self.finish()
else:
result1 = result1[0]
do_something()
self.write(response)
BaseRequestHandler 是:
class BaseRequestHandler(tornado.web.RequestHandler):
"""
Base Class for all the future classes
Activities like logging should be done in this class.
Allow cors request in this class
"""
def set_default_headers(self):
print "setting headers!!!"
def write_error(self, status_code, **kwargs):
response = {}
handle_error_messages..
self.write(response)
@staticmethod
def extract_psycopg2_integrity_error(error):
return error.message.split("Key")[1].replace("(", "").replace(")", "").split(".")[0].replace("=", " ")
def prepare(self):
logging.debug(
"[info] Class {} via {} with body {}".format(self.__class__.__name__, self.request.uri, self.request.body))
所以,这里如果 result1 为空,那么它应该完成 API 和 return 的执行。但是我收到这个错误 RuntimeError: Cannot write() after finish()
如何停止执行
你不需要"self.finish",它完成了 Tornado 的响应写入,但它不会停止你的函数的执行。要停止执行函数,请添加 return
语句:
def get(self)
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
return # <-- here
else:
result1 = result1[0]
do_something()
self.write(response)
另一种选择是缩进最后一行,使其保留在 "else" 子句中:
def get(self):
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
else:
result1 = result1[0]
do_something()
self.write(response) # indented 4 more spaces
另一种方法非常有用,当你想从代码中的任何地方强制结束请求时,即使很难return
(例如从辅助函数),是提高tornado.web.Finish
异常。
我对 tornado 比较陌生,我试图在条件通过时停止执行某个方法,否则它应该继续执行下一行代码(类似于 return)
这是我卡住的代码部分,
class PostMatchHandler(BaseRequestHandler):
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
self.finish()
else:
result1 = result1[0]
do_something()
self.write(response)
BaseRequestHandler 是:
class BaseRequestHandler(tornado.web.RequestHandler):
"""
Base Class for all the future classes
Activities like logging should be done in this class.
Allow cors request in this class
"""
def set_default_headers(self):
print "setting headers!!!"
def write_error(self, status_code, **kwargs):
response = {}
handle_error_messages..
self.write(response)
@staticmethod
def extract_psycopg2_integrity_error(error):
return error.message.split("Key")[1].replace("(", "").replace(")", "").split(".")[0].replace("=", " ")
def prepare(self):
logging.debug(
"[info] Class {} via {} with body {}".format(self.__class__.__name__, self.request.uri, self.request.body))
所以,这里如果 result1 为空,那么它应该完成 API 和 return 的执行。但是我收到这个错误 RuntimeError: Cannot write() after finish()
如何停止执行
你不需要"self.finish",它完成了 Tornado 的响应写入,但它不会停止你的函数的执行。要停止执行函数,请添加 return
语句:
def get(self)
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
return # <-- here
else:
result1 = result1[0]
do_something()
self.write(response)
另一种选择是缩进最后一行,使其保留在 "else" 子句中:
def get(self):
result1 = "some sql query".execute()
if not result1:
response.update({'info': 'Levels Completed', 'status': settings.STATUS_200})
self.write(response)
else:
result1 = result1[0]
do_something()
self.write(response) # indented 4 more spaces
另一种方法非常有用,当你想从代码中的任何地方强制结束请求时,即使很难return
(例如从辅助函数),是提高tornado.web.Finish
异常。