會話是客戶端登錄到服務(wù)器并注銷服務(wù)器的時間間隔胶果。需要在該會話中保存的數(shù)據(jù)會存儲在服務(wù)器上的臨時目錄中。
這個對象相當(dāng)于用密鑰簽名加密的 cookie 谈况,即用戶可以查看你的 cookie 勺美,但是如果沒有密鑰就無法修改它
會話會為每個客戶端的會話分配會話ID。會話數(shù)據(jù)存儲在cookie的頂部碑韵,服務(wù)器以加密方式對其進(jìn)行簽名
一個實現(xiàn)了簡單登錄功能的demo
:
from flask import Flask, session, redirect, url_for, request
# 創(chuàng)建一個app實例
app = Flask(__name__)
"""
必須創(chuàng)建一個 secret_key赡茸,創(chuàng)建方法:
import os
print(os.urandom(16))
"""
app.secret_key = '\xf9\x84L<\x12/;\xcfg\xdf\x18!I:\xa3\x8e?\xed\x08O'
# 主頁面,如果有會話數(shù)據(jù)則顯示登陸人祝闻,如果沒有會話數(shù)據(jù)則提示跳轉(zhuǎn)到登錄
@app.route('/')
def root():
if 'username' in session:
username = session['username']
return f"{username} 正在訪問主頁<br/><a href='/logout'>點擊這里注銷</a>"
return "未登錄, 無法訪問該頁面<br/><a href='/login'>點擊這里登錄</a>"
# 登錄占卧,如果發(fā)送的是post請求則去進(jìn)行校驗遗菠,校驗通過跳轉(zhuǎn)到主頁面,如果發(fā)送的是get請求則顯示登錄頁面
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('root'))
return '''
<form action = "" method = "post">
<p><input type="text" name="username"/></p>
<p><input type="submit" value ="登錄"/></p>
</form>
'''
# 刪除會話并且跳轉(zhuǎn)到主頁
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('root'))
if __name__ == '__main__':
app.run(debug=True)
效果: