2017-02-18 4 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()' обработка запроса завершена, и будут освобождены ресурсы (например, сетевое соединение). Таким образом, если вы вызываете какие-либо методы 'write' после' finish', ему негде записывать данные - поэтому он вызывает «RuntimeError». Обратите внимание, что 'finish()' завершает запрос, а не сопрограмму coroutine, для завершения сопрограммы, в которой вам нужно либо использовать '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.

Смежные вопросы