# 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`是將所有的訊息一次取出,因此需要利用迴圈來取得所有的訊息 接著執行專案,這時候會發現專案異常,出現錯誤訊息,如下圖: ![](https://i.imgur.com/rvcyK8U.png) 這是因為在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> 調整之後重新執行專案,再做一次登入測試,如下: ![](https://i.imgur.com/X7FaWTI.png) 在HTML文件說明中提到,`get_flashed_messages`會將`session`內的所有`message`全部取出,而它的形成僅在這一次的執行上下文中,因此執行一次之後消息就不見了,不需要擔心被其他登入的使用者攔到。 這部份的驗證可以在實作之後,直接按`f5`就可以證實,`message`的部份是消失的狀態,如下: ![](https://i.imgur.com/IzEM1Z2.png) ## 註解說明 <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)