2017-02-18 134 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異常。