Flask Обработка исключений и мигание сообщений - PullRequest
1 голос
/ 19 июня 2020

У меня есть код python, который регистрирует ошибку в консоли при невыполнении определенных условий. Я пытаюсь отобразить те же ошибки в браузере, когда необходимые условия не выполняются. Для иллюстрации рассмотрим самую основную идею c функции add_stuff, которая проверяет, имеют ли входные данные тип int. В противном случае на экран выводится сообщение об ошибке.

Следующее простое приложение flask и соответствующий файл шаблона работают, а ошибка значения фактически выводится на экран. Но я пытаюсь «красиво распечатать» ошибку, чтобы она не печатала уродливую страницу с ошибкой jinga2, а вместо этого оставалась на той же странице math.html с ошибкой, выводимой на экран, или возможными перенаправлениями на привлекательную страницу, которая не переполнен трассировками и т.д. c.

from flask import Flask, render_template, request, session, current_app
server = Flask(__name__)

def add_stuff(x,y):
    if isinstance(x, int) and isinstance(y, int):
        z = x + y
        return z
    else:
        raise ValueError("Not integers")       


@server.route('/math')
def foo():
    a = 1
    b = 15
    out = add_stuff(a,b)
    return render_template('math.html', out=out)  

if __name__ == '__main__':
    server.run(debug=True)

Вот файл шаблона

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>

<body>

{{out}}

</body>
</html>

1 Ответ

1 голос
/ 19 июня 2020

Вы можете поймать исключение метода add_stuff, чтобы прекратить отображение страницы ошибки jinja2.

Здесь я включил сообщение об исключении в flash и отобразил его в шаблоне. Если есть исключение, я не отображаю значение out в шаблоне.

from flask import Flask, flash, redirect, render_template, \
     request, url_for

server = Flask(__name__)
server.secret_key = b'_5#y2L"F4Q8z\n\xec]/'


def add_stuff(x,y):
    if isinstance(x, int) and isinstance(y, int):
        z = x + y
        return z
    else:
        raise ValueError("Not integers")       


@server.route('/math')
def foo():
    a = 1
    b = "some string"
    out = None
    try:
        out = add_stuff(a,b)
    except Exception as e:
        flash(str(e))
    if out is not None:
        return render_template('math.html', out=out)
    else:
        return render_template('math.html')

math.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>

<body>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
        {% for message in messages %}
          <li>{{ message }}</li>
        {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}

{% if out %}
    {{out}}
{% endif %}
</body>
</html>

Вывод:

output of flash

Вы также можете классифицировать flash сообщения в соответствии с требованиями (например: ошибка, предупреждение и т. Д. c.). Вы можете прочитать официальную документацию здесь .

...