English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Мгновенные сообщения Flask (Flash)

Приложения с графическим интерфейсом требуют предоставлять пользователям интерактивные сообщения о phảnождении. Например, десктопные приложения используют диалоговые окна или сообщения, а JavaScript использует функцию alert() для аналогичных целей.

В Web-приложении Flask легко генерировать такие сообщения. Система всплывающих сообщений в рамке Flask позволяет создавать сообщение в одном представлении и отображать его в функции представления с именем next.

Модуль Flask содержит метод flash(). Он передает сообщение к следующему запросу, который обычно является шаблоном.

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
flash(message, category)

Здесь -

message - Параметр это само сообщение, которое нужно обновить. category - Параметр является необязательным. Он может быть 'ошибка', 'информация' или 'предупреждение'.

Чтобы удалить сообщение из сессии, шаблон вызывает функцию get_flashed_messages().

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
get_flashed_messages(with_categories, category_filter)

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

Ниже приведен шаблон для полученных сообщений.

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
{% with messages = get_flashed_messages() %}
    {% if messages %}
       {% for message in messages %}
          {{ message }}
       {% endfor %}
    {% endif %}
 {% endwith %}

Теперь давайте посмотрим на простой пример, демонстрирующий механизм всплывающих сообщений в Flask. В следующем коде URL => "/" отображает ссылку на страницу входа, не указывая отправляемое сообщение.

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
@app.route('/')
 def index():
     return render_template('index.html')

Эта ссылка направляет пользователя к URL для отображения формы входа => "/login". При подаче заявки функция login() проверяет имя пользователя и пароль, и соответствующим образом всплывает сообщение "Успешно" или "Ошибка".

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
@app.route('/login', methods=['GET', 'POST'])
 def login():
     error = None
     if request.method == 'POST':
         if request.form['username'] != 'admin' or \
             request.form['password'] != 'admin':
             error = 'Invalid username or password. Please try again!'
         else:
             flash('You were successfully logged in')
             return redirect(url_for('index'))
     return render_template('login.html', error=error)

Если есть ошибка, шаблон входа будет повторно отображаться с сообщением об ошибке.

Файл шаблона: login.html Код таков -

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Пример Flask</title>
 </head>
    <body>
      <h1>Вход</h1>
       {% if error %}
       <p><strong>Ошибка:</strong> {{ error }}
       {% endif %}
       <form action="/login" method="POST">
          <dl>
             <dt>Имя пользователя:</dt>
             <dd>
                <input type=text name="username" 
                   value="{{request.form.username}}">
             </dd>
             <dt>Пароль:</dt>
             <dd><input type="password" name="password"></dd>
          </dl>
          <p><input type=submit value="Вход"></p>
       </form>
    </body>
 </html>

Если вход успешен, на шаблоне индекса будет показано успешное сообщение. Следующий код сохранен в файле ( index.html) -

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
<html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>Flask Message Flashing</title>
 </head>
    <body>
          {% with messages = get_flashed_messages() %}
           {% if messages %}
             <ul class=flashes>
             {% for message in messages %}
               <li>{{ message }}</li>
             {% endfor %}
             </ul>
           {% endif %}
         {% endwith %}
       <h1>Пример Flask Message Flashing</h1>
       <p>Вы хотите <a href="{{ url_for('login') }}">
          <b>Вход?</b></a></p>
    </body>
 </html>

Полный код примера Flask Message Flashing показан ниже -

# Имя файла: example.py
# Авторское право: 2020 By w3codebox
# Автор по: ru.oldtoolbag.com
# Дата: 2020-08-08
from flask import Flask, flash, redirect, render_template, request, url_for
 app = Flask(__name__)
 app.secret_key = 'random string'
 @app.route('/')
 def index():
    return render_template('index.html')
 @app.route('/login', methods=['GET', 'POST'])
 def login():
     error = None
     print(request.method)
     if request.method == 'POST':
         if request.form['username'] != 'admin' or \
             request.form['password'] != 'admin':
             error = 'Invalid username or password. Please try again!'
         else:
             #flash('Вы успешно вошли в систему')
             flash('You were successfully logged in')
             return redirect(url_for('index'))
     return render_template('login.html', error=error)
 if __name__ == "__main__":
     app.run(debug=True)

После выполнения вышеуказанного кода вы увидите экран, как показано ниже.

При нажатии на ссылку будет переход на страницу входа. Введите имя пользователя и пароль -

Нажмите ВходКнопка. Будет отображено сообщение «Вы успешно вошли в систему».