Flask框架從入門到精通之Session(九)

知識點: 一、Sessionpython

1、概況

上一篇,咱們說到cookie,除了cookie外還有一個叫session的機制。session也是能夠存儲一些信息的。對於一些敏感、重要的信息,咱們能夠存儲到session中。誰也不但願本身的餘額、銀行卡密碼存到cookie當中。 cookie和session結合使用:web開發發展至今,cookie和session的使用已經出現了一些很是成熟的方案。在現在的市場或者企業裏,通常有兩種存儲方式:web

存儲在服務端:經過cookie存儲一個session_id,而後具體的數據則是保存在session中。若是用戶已經登陸,則服務器會在cookie中保存一個session_id,下次再次請求的時候,會把該session_id攜帶上來,服務器根據session_id在session庫中獲取用戶的session數據。就能知道該用戶究竟是誰,以及以前保存的一些狀態信息。這種專業術語叫作server side session。redis

將session數據加密,而後存儲在cookie中。這種專業術語叫作client side session。flask採用的就是這種方式,可是也能夠替換成其餘形式。sql

2、session

每一個網站都有登陸功能,當登陸成功,一段時間都不須要再登陸了。那登陸保持這個狀態咱們就能夠經過session來搞定。 flask裏面的session必需要設置SECRET_KEYmongodb

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裏面。咱們看一下:
在這裏插入圖片描述

3、過時時間

若是沒有設置session的有效期。那麼默認就是瀏覽器關閉後過時。 若是設置session.permanent=True,那麼就會默認在31天后過時。 若是不想在31天后過時,那麼能夠設置app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hour=2)在兩個小時後過時。flask

4、刪除session

刪除session中的值:也是相似字典。能夠有三種方式刪除session中的值。 session.pop(key) del session[key] session.clear()瀏覽器

5、把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的數據庫看一下。
在這裏插入圖片描述
歡迎關注個人公衆號:

image
相關文章
相關標籤/搜索