# Flask實作_基礎_10_flash message
###### tags: `python` `flask` `flash`
使用者在提交文件的時候如果有格式不符的情況,系統需要讓使用者知道那一部份不符合規範,這時候可以利用`flash`將訊息由後端傳到前端,這是一個非常實用的function。
## 作業說明
延續[Flask實作_基礎_09_redirect after some action](https://hackmd.io/s/rkpy9CGZz)的範例,使用者登入成功之後我們希望丟一個訊息告知使用者登入成功,`flash`是flask的內建函數,因此可以直接`import`
```python=
from flask import flash
```
讓我們調整一下Python文件,如下:
```python=
from flask import Flask, request, render_template, redirect, url_for, flash
app = Flask(__name__)
@app.route('/loginurl', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
if login_check(request.form['username'], request.form['password']):
flash('Login Success!')
return redirect(url_for('hello', username=request.form.get('username')))
return render_template('login.html')
def login_check(username, password):
"""登入帳號密碼檢核"""
if username == 'admin' and password == 'hello':
return True
else:
return False
@app.route('/hello/<username>')
def hello(username):
return render_template('hello.html', username=username)
if __name__ == '__main__':
app.debug = True
app.run()
```
第13行:設置一個登入帳號密碼檢核的function
第8行:檢核帳號密碼是否正確
第9行:登入成功則發送一個『Login Success!』的訊息
接著調整HTML文件,如下:
* file name: hello.html
```htmlmixed=
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class="flash">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
hello, {{ username }}, Welcome my homepage!
</body>
</html>
```
第8行:`get_flashed_messages`會將`session`內的所有`message`全部取出<sub><a href='#note_1'>註1</a></sub>
第9行:判斷是否有`message`,因為`get_flashed_messages`是將所有的訊息一次取出,因此需要利用迴圈來取得所有的訊息
接著執行專案,這時候會發現專案異常,出現錯誤訊息,如下圖:

這是因為在flask中只要你要用到`session`,就需要有一組key去做加密,避免資訊安全問題,因此我們需要調整Python做參數設置如下:
```python=
#...上略...#
if __name__ == '__main__':
app.debug = True
app.secret_key = "Your Key"
app.run()
```
第4行:加入`secret_key`參數設置<sub><a href='#note_2'>註2</a></sub>
調整之後重新執行專案,再做一次登入測試,如下:

在HTML文件說明中提到,`get_flashed_messages`會將`session`內的所有`message`全部取出,而它的形成僅在這一次的執行上下文中,因此執行一次之後消息就不見了,不需要擔心被其他登入的使用者攔到。
這部份的驗證可以在實作之後,直接按`f5`就可以證實,`message`的部份是消失的狀態,如下:

## 註解說明
<span id='note_1'>註1</span>:[get_flashed_messages](https://github.com/pallets/flask/blob/master/flask/helpers.py#L415)
<span id='note_2'>註2</span>:可以利用`os.urandom(xx)`來產生,可見[官方文件](http://flask.pocoo.org/docs/1.0/config/?highlight=secret_key#SECRET_KEY)說明
## 總結
這節主要練習`flash`與前端`get_flashed_messages`的搭配使用,也瞭解到利用`get_flashed_messages`來取得`message`的話可以一次傳遞很多,你可以自行測試一個簡單的範例,連續的`flash('message')`,並且觀察是否確實的出現三個訊息。
最後要討論的基礎是關於`jinja2`模板繼承的概念,瞭解之後我們就可以進入實作。
**上一話:**[Flask實作_基礎_09_redirect after some action](https://hackmd.io/s/rkpy9CGZz)
**下一話:**[Flask實作_基礎_11_jinja2_樣板繼承](https://hackmd.io/s/B1Fg-6j-z)