與Cookie不同,會話數(shù)據(jù)存儲在服務(wù)器上。 會話是客戶端登錄到服務(wù)器并注銷的時間間隔。 需要在此會話中進行的數(shù)據(jù)存儲在服務(wù)器上的臨時目錄中。
與每個客戶端的會話分配一個會話ID。 會話數(shù)據(jù)存儲在cookie頂部,服務(wù)器以加密方式簽名。 對于這種加密,F(xiàn)lask應(yīng)用程序需要一個定義SECRET_KEY。
會話對象也是一個包含會話變量和關(guān)聯(lián)值的鍵值對的字典對象。
例如,要設(shè)置'username'會話變量,請使用語句 -
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 Session['username'] = 'admin'
要刪除會話變量,請使用pop()方法。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 session.pop('username', None)
以下代碼是Flask中會話如何工作的簡單演示。 URL => '/' 提示用戶登錄,因為會話變量username沒有設(shè)置。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 @app.route('/') def index(): if 'username' in session: username = session['username'] return 'Logged in as ' + username + '<br>' + \ "<b><a href = '/logout'>click here to log out</a></b>" return "You are not logged in <br><a href = '/login'></b>" + \ "click here to log in</b></a>"
當(dāng)用戶瀏覽到URL=>'/login'時,login()函數(shù)顯示視圖,因為它是通過GET方法調(diào)用的,所以打開一個登錄表單。
表單填寫后重新提交到URL=> /login,現(xiàn)在會話變量被設(shè)置。 應(yīng)用程序被重定向到URL=> /。 這時找到會話變量:username。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 @app.route('/login', methods = ['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action = "" method = "post"> <p><input type = text name = "username"/></p> <p<<input type = submit value = Login/></p> </form> '''
該應(yīng)用程序還包含一個logout()視圖函數(shù),它刪除’username’會話變量的值。 再次 URL 跳轉(zhuǎn)到 ‘/‘ 顯示開始頁面。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 @app.route('/logout') def logout(): # remove the username from the session if it is there session.pop('username', None) return redirect(url_for('index'))
運行應(yīng)用程序并訪問主頁(確保設(shè)置應(yīng)用程序的secret_key)。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) app.secret_key = 'any random string’
完整代碼如下所示 -
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.jixiangtaizi.com.cn # Date : 2020-08-08 from flask import Flask from flask import render_template from flask import request from flask import make_response from flask import Flask, session, redirect, url_for, escape, request app = Flask(__name__) app.secret_key = 'fkdjsafjdkfdlkjfadskjfadskljdsfklj' @app.route('/') def index(): if 'username' in session: username = session['username'] return '登錄用戶名是:' + username + '<br>' + \ "<b><a href = '/logout'>點擊這里注銷</a></b>" return "您暫未登錄, <br><a href = '/login'></b>" + \ "點擊這里登錄</b></a>" @app.route('/login', methods = ['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action = "" method = "post"> <p><input type ="text" name ="username"/></p> <p><input type ="submit" value ="登錄"/></p> </form> ''' @app.route('/logout') def logout(): # remove the username from the session if it is there session.pop('username', None) return redirect(url_for('index')) if __name__ == '__main__': app.run(debug = True)
輸出將顯示如下。點擊鏈接“ 點擊這里登錄”。
該鏈接將被引導(dǎo)至另一個界面。 輸入’admin’。
屏幕會顯示消息“ 登錄用戶名是:admin”。如下所示 -