2017-02-18 135 views
1

我相对较新的龙卷风,我试图停止执行方法,如果条件通过,否则它应该继续下一行代码(类似于返回)Python龙卷风停止执行完成()

这是我的代码,我在哪里卡住了,

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的执行和RET瓮。但我得到这个错误RuntimeError: Cannot write() after finish()

我该如何停止执行。

+0

一旦你调用finish(),请求处理就完成了,它的资源(如网络连接)就被释放了。因此,如果在'finish'之后调用任何'write'方法,它就无处可写数据 - 这就是为什么会引发'RuntimeError'的原因。请注意,'finish()'结束了请求,而不是协程,完成一个协程,你需要使用'return'(没有任何Python 2的参数)或'raise gen.Return(None)'。 – Nikita

回答

3

你不需要“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) 

另一种选择是要缩进的最后一行所以它仍是“其他”条款中:

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 
+0

是的,增加回报有诀窍。谢谢 :) –

0

另一种方法,很如果您想强制从代码中的任何位置结束请求,即使难以执行return(例如,从帮助程序功能),也会引发tornado.web.Finish异常。