2016-10-11 5 views
0

Gibt es eine Möglichkeit, dem Benutzer eine Warnung anzuzeigen und einfach mit der aufgerufenen Funktion fortzufahren?Wie zeigt man eine Warnung mit Python tornado

Alles, was ich in Tornado finden kann, ist der HTTPError. Gibt es so etwas, um eine Warnung anzuzeigen?

Aktuelle Schnipsel:

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

put_function() 

Dies wirft einen Fehler, und die Funktion wird nicht aufgerufen.

Antwort

1

Wenn Sie mit Ihrer Verarbeitung fortfahren möchten, werden Sie keinen Fehler mehr melden wollen. Dies hat je nach Setup eine Reihe von Auswirkungen. In der Regel wird ein Fehler ausgelöst, wenn der Status auf einen anderen Wert als 200 gesetzt wird, was wahrscheinlich nicht der Fall ist. Im Allgemeinen wird die Exception-Protokollierung ausgelöst, die Sie haben (in unserem Fall werden Fehler an die Sentry gesendet). In der Regel werden die Datenbanktransaktionen automatisch zurückgesetzt.

Wenn Sie nur eine Warnung für einen Benutzer anzeigen möchten, weil sie etwas "schlechtes" getan haben, aber die Verarbeitung fortsetzen, werden Sie einen anderen Mechanismus benötigen. Ich habe zwei verschiedene Möglichkeiten, wie ich mit dieser Situation umgehen kann, abhängig vom Kontext. Meistens zeige ich beim nächsten Laden der Seite (nach dem Post, der die Warnung hatte) automatisch eine Nachricht an, indem ich einen Cookie setze und ihn anzeigen lasse. Was für Sie funktioniert, hängt davon ab, wie Ihre App eingerichtet ist. Wenn Ihre Anrufe alle Ajax-Anrufe sind, können Sie ein Objekt haben, um Warnungen und andere Nachrichten, die in Ihren Ajax-Anrufen eingebaut sind, zurückzugeben.

Die andere Sache, die wir tun, ist, dass für einige Seiten, die Stapelbefehle behandeln, wo es viele Warnungen geben könnte, dann haben wir eine spezielle Seite, die lädt, wenn Warnungen, die eine Liste von Warnungen zu handhaben sind.

Hier ist unser Code, der die Warnmeldung in Python setzt und liest. Dies ist in unserer Basis-Controller-Klasse, so dass es in allen Controllern verfügbar ist. Sie könnten auch den Teil in Javascript schreiben:

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