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

〆 小源。發表於2019-04-30

知識點: 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的資料庫看一下。
在這裡插入圖片描述
歡迎關注我的公眾號:

image

相關文章