2016-10-11 2 views
0

Есть ли способ показать предупреждение пользователю и продолжить работу с вызываемой функцией?Как показать предупреждение с использованием торнадо Python

Все, что я могу найти в торнадо, это HTTPError. Есть ли что-нибудь подобное, чтобы показать предупреждение?

Текущий фрагмент:

if warning_bool: 
    warning_text = "Warning! You can still continue though..." 
    raise HTTPError(status_code=400, reason=warning_text) 

put_function() 

Это вызывает ошибку и функция не вызывается.

ответ

1

Если вы хотите продолжить обработку, вы не захотите поднять ошибку. Это имеет ряд эффектов в зависимости от вашей настройки. Обычно повышение ошибки устанавливает статус на что-то отличное от 200, что, вероятно, не то, что вы хотите. Он, как правило, отключает любое ведение журнала исключений (в нашем случае он отправляет ошибки часовому), и он обычно автоматически откатывает транзакции с базой данных.

Если вы просто хотите отобразить предупреждение пользователю, потому что они сделали что-то «плохое», но продолжить обработку, вам понадобится другой механизм. У меня есть два разных способа обработки этой ситуации в зависимости от контекста. В большинстве случаев я автоматически показываю сообщение на следующей загрузке страницы (после сообщения с предупреждением), устанавливая файл cookie и отображая его. Что работает для вас, будет отличаться в зависимости от того, как настроено ваше приложение. Если ваши вызовы - это все вызовы ajax, у вас может быть объект для возврата предупреждений и других сообщений, встроенных в ваши вызовы ajax.

Другое дело, что для некоторых страниц, которые обрабатывают командные команды, где может быть много предупреждений, у нас есть специальная страница, которая загружается, если есть предупреждения, которые знают, как обрабатывать список предупреждений.

Вот наш код, который устанавливает и читает предупреждающее сообщение в Python. Это в нашем базовом классе контроллера, так что он доступен во всех контроллерах. Вы также можете написать прочитанную часть в javascript:

def flash(self, msg, msg_type="info"): 
    self.flash_info = (msg, msg_type) 
    self.set_cookie('flash', base64.b64encode(bytes(json.dumps([msg, msg_type]), 'utf-8'))) 

def get_flash(self): 
    msg = None 
    msg_type = None 
    if hasattr(self, "flash_info"): 
     msg, msg_type = self.flash_info 
    else: 
     flash_msg = self.get_cookie('flash') 
     if flash_msg: 
      msg, msg_type = json.loads(base64.b64decode(flash_msg).decode('utf-8')) 
      self.clear_cookie('flash') 
    self.clear_cookie('flash') 
    return msg, msg_type 
Смежные вопросы