知識點: 1、Session
一、概況
上一篇,我們說到cookie,除了cookie外還有一個叫session的機制。session也是可以儲存一些資訊的。對於一些敏感、重要的資訊,我們可以儲存到session中。誰也不希望自己的餘額、銀行卡密碼存到cookie當中。 cookie和session結合使用:web開發發展至今,cookie和session的使用已經出現了一些非常成熟的方案。在如今的市場或者企業裡,一般有兩種儲存方式:
儲存在服務端:通過cookie儲存一個session_id,然後具體的資料則是儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存一個session_id,下次再次請求的時候,會把該session_id攜帶上來,伺服器根據session_id在session庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做server side session。
將session資料加密,然後儲存在cookie中。這種專業術語叫做client side session。flask採用的就是這種方式,但是也可以替換成其他形式。
二、session
每個網站都有登入功能,當登入成功,一段時間都不需要再登入了。那登入保持這個狀態我們就可以通過session來搞定。
flask裡面的session必須要設定SECRET_KEY
from flask import Flask, request, render_template, session, redirect
from datetime import datetime
app = Flask(__name__)
app.config['SECRET_KEY'] = 'laowangaigebi' # 設定session加密的金鑰
@app.route('/login', methods=['GET', 'POST']) # 支援get、post請求
def login(): # 登入檢視函式
# 模擬登入成功後把uid和username存到session裡
session['uid'] = '123456'
session['username'] = 'laowang'
return redirect('/') # 登入成功後到首頁
@app.route('/', methods=['GET', 'POST']) # 支援get、post請求
def index():
username = session.get('username') # 取session
if username:
return 'welcome %s' % username
else:
return '請登入'
app.config['DEBUG'] = True
if __name__ == '__main__':
# 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
app.run(host='0.0.0.0', port=5000) # 執行程式
複製程式碼
首頁我們先訪問一下首頁:
然後我模型一下點選請登入跳轉到了登入頁:http://0.0.0.0:5000/login 會重新到首頁: 我們在新開一個瀏覽器標籤在去訪問一下首頁: flask把session的資訊加密儲存到cookie裡面。我們看一下:三、過期時間
如果沒有設定session的有效期。那麼預設就是瀏覽器關閉後過期。 如果設定session.permanent=True,那麼就會預設在31天后過期。 如果不想在31天后過期,那麼可以設定app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hour=2)在兩個小時後過期。
四、刪除session
刪除session中的值:也是類似字典。可以有三種方式刪除session中的值。 session.pop(key) del session[key] session.clear()
五、把session存在服務端
我們可以利用flask-session來把session存在伺服器,畢竟session的資料比較重要,存在瀏覽器中不安全。
flask-session支援把session存在各種資料庫中
- redis
- memcached
- filesystem
- mongodb
- sqlalchmey
我們最好把session存在記憶體級的redis資料庫中,讀寫速度比較快。
首先先安裝flask-session
pip install flask-session
pip install redis
複製程式碼
然後啟動我們的redis,在程式碼中寫上如下配置。
from flask import Flask, request, session
import redis
from flask_session import Session
# 初始化Session物件
f_session = Session()
app = Flask(__name__)
app.config['SECRET_KEY'] = 'laowangaigebi' # 加密的金鑰
app.config['SESSION_USE_SIGNER'] = True # 是否對傳送到瀏覽器上session的cookie值進行加密
app.config['SESSION_TYPE'] = 'redis' # session型別為redis
app.config['SESSION_KEY_PREFIX'] = 'session:' # 儲存到session中的值的字首
app.config['PERMANENT_SESSION_LIFETIME'] = 7200 # 失效時間 秒
app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port='6379', db=4) # redis資料庫連線
# 繫結flask的物件
f_session.init_app(app)
@app.route("/")
def index():
session['xingming'] = 'laozhao'
return '存session'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
複製程式碼
執行程式。
這個是瀏覽器的就是session的id。並不是session的值,可以去redis的資料庫看一下。 歡迎關注我的公眾號: